import java.util.Collection; public class PerformanceMeasurement { RecordByTypeContainer recordByTypeContainer = new RecordByTypeContainer(); public void record(String type, long elapsed) { RecordByType recordByType = recordByTypeContainer.getRecordByType(type); recordByType.addEntry(elapsed); } public long averageExecutionTime() { long sum = 0; for (RecordByType recordByType : recordByTypeContainer.getAllRecordByType()) { sum += recordByType.averageExecutionTime(); } return recordByTypeContainer.size() > 0 ? sum / recordByTypeContainer.size() : 0; } public CollectiongetRecordByTypes() { return recordByTypeContainer.getAllRecordByType(); } public void reset() { for (RecordByType recordByType : recordByTypeContainer.getAllRecordByType()) { recordByType.clear(); } } } import java.util.Collections; import java.util.List; import java.util.ArrayList; public class RecordByType { private String type; private List measurements = Collections.synchronizedList(new ArrayList ()); public RecordByType(String type) { this.type = type; } public synchronized void addEntry(long elapsed) { measurements.add(elapsed); } public long averageExecutionTime() { long result = 0; synchronized (measurements) { for (Long item : measurements) { result += item; } } return measurements.size() > 0 ? result / measurements.size() : 0; } public int numberOfRecordsAboveThreshold(long i) { int count = 0; synchronized (measurements) { for (Long item : measurements) { if (item > i) count++; } } return count; } public synchronized void clear() { measurements.clear(); } public String getType() { return type; } public void setType(String type) { this.type = type; } } import java.util.Collection; import java.util.HashMap; @SuppressWarnings("serial") public class RecordByTypeContainer extends HashMap { public RecordByType getRecordByType(String type) { RecordByType result = get(type); if (result == null) { result = new RecordByType(type); this.put(type, result); } return result; } public Collection getAllRecordByType() { return values(); } }
How to use it:
// create tooling
static final PerformanceMeasurement performanceMeasurement = new PerformanceMeasurement();
// reset to a know state
performanceMeasurement.reset();
// do all the tests each of which records the elapsed type
long now = System.currentTimeMillis();
// .... RUN YOUR TEST HERE
long elapsed = (System.currentTimeMillis() - now);
performanceMeasurement.record("TEST_TYPE", elapsed);
// print stats or do asserts
assertTrue("global averageExecutionTime", performanceMeasurement.averageExecutionTime() < 1600); for (RecordByType recordByType : performanceMeasurement.getRecordByTypes()) { assertTrue("individual averageExecutionTime for type " + recordByType.getType(), recordByType.averageExecutionTime() < 1600); assertTrue("execution threshold for type " + recordByType.getType(), recordByType.numberOfRecordsAboveThreshold(2000) < 10); }
Works like magic!
No comments:
Post a Comment