| /******************************************************************************* |
| * Copyright (c) 2007, 2016 IBM Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.text.tests.performance; |
| |
| import java.util.Collection; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| import java.util.Map; |
| |
| import org.junit.Assert; |
| |
| import org.eclipse.test.internal.performance.InternalPerformanceMeter; |
| import org.eclipse.test.internal.performance.OSPerformanceMeter; |
| import org.eclipse.test.internal.performance.data.DataPoint; |
| import org.eclipse.test.internal.performance.data.Dim; |
| import org.eclipse.test.internal.performance.data.Sample; |
| import org.eclipse.test.internal.performance.data.Scalar; |
| |
| |
| /** |
| * An accumulating performance meter that tracks elapsed time between |
| * consecutive calls to <code>on</code> and <code>off</code> using |
| * <code>System.currentTimeMillis()</code>. |
| * |
| * @since 3.4 , extracted from {@link DocumentLineDifferModificationTest} |
| */ |
| final class DifferenceMeter extends InternalPerformanceMeter { |
| |
| private final InternalPerformanceMeter fReferenceMeter; |
| private final InternalPerformanceMeter fMeasuredMeter; |
| |
| |
| /** |
| * @param scenarioId the scenario id |
| */ |
| public DifferenceMeter(String scenarioId) { |
| super(scenarioId); |
| |
| fReferenceMeter= new OSPerformanceMeter(scenarioId); |
| fMeasuredMeter= new OSPerformanceMeter(scenarioId); |
| } |
| |
| /* |
| * @see org.eclipse.test.performance.PerformanceMeter#start() |
| */ |
| @Override |
| public void start() { |
| throw new UnsupportedOperationException(); |
| } |
| |
| /* |
| * @see org.eclipse.test.performance.PerformanceMeter#stop() |
| */ |
| @Override |
| public void stop() { |
| throw new UnsupportedOperationException(); |
| } |
| |
| /* |
| * @see org.eclipse.test.performance.PerformanceMeter#dispose() |
| */ |
| @Override |
| public void dispose() { |
| fReferenceMeter.dispose(); |
| fMeasuredMeter.dispose(); |
| super.dispose(); |
| } |
| |
| @Override |
| public Sample getSample() { |
| Map<String, String> properties= new HashMap<>(); |
| |
| Sample reference= fReferenceMeter.getSample(); |
| DataPoint[] referencePoints= reference.getDataPoints(); |
| |
| Sample measured= fMeasuredMeter.getSample(); |
| DataPoint[] measuredPoints= measured.getDataPoints(); |
| |
| Assert.assertEquals(referencePoints.length, measuredPoints.length); |
| |
| DataPoint[] data= new DataPoint[referencePoints.length]; |
| for (int i= 0; i < measuredPoints.length; i++) { |
| DataPoint r= referencePoints[i]; |
| DataPoint m= measuredPoints[i]; |
| |
| data[i]= difference(m, r); |
| } |
| |
| return new Sample(getScenarioName(), measured.getStartTime(), properties, data); |
| } |
| |
| /* |
| * @see org.eclipse.test.internal.performance.InternalPerformanceMeter#printSample(java.io.PrintStream, org.eclipse.test.internal.performance.data.Sample) |
| */ |
| private DataPoint difference(DataPoint minuend, DataPoint subtrahend) { |
| Collection<Dim> mDims= minuend.getDimensions2(); |
| int step= minuend.getStep(); |
| Assert.assertEquals(step, subtrahend.getStep()); |
| |
| Map<Dim, Scalar> scalars= new HashMap<>(); |
| for (Iterator<Dim> it= mDims.iterator(); it.hasNext();) { |
| Dim dimension= it.next(); |
| |
| Scalar m= minuend.getScalar(dimension); |
| Scalar s= subtrahend.getScalar(dimension); |
| |
| if (m != null && s != null) { |
| long difference= m.getMagnitude() - s.getMagnitude(); |
| Scalar scalar= new Scalar(dimension, difference); |
| scalars.put(dimension, scalar); |
| } |
| } |
| |
| return new DataPoint(step, scalars); |
| } |
| |
| public void startReference() { |
| fReferenceMeter.start(); |
| } |
| |
| public void stopReference() { |
| fReferenceMeter.stop(); |
| } |
| |
| public void startMeasured() { |
| fMeasuredMeter.start(); |
| } |
| |
| public void stopMeasured() { |
| fMeasuredMeter.stop(); |
| } |
| } |