blob: 3e4ae6577bcc6b90fceaf087cddd45f0981db43c [file] [log] [blame]
/*******************************************************************************
* 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();
}
}