package com.github.benjchristensen.gist.perf; import java.util.Iterator; import rx.functions.Action0; public abstract class AbstractPerformanceTester { public static final long REPETITIONS = 5 * 1000 * 1000; public static final int NUM_PRODUCERS = 1; private final long repetitions; protected AbstractPerformanceTester(long repetitions) { this.repetitions = repetitions; } public final void runTest(Action0 action) throws InterruptedException { for (int runNum = 0; runNum < 15; runNum++) { System.gc(); Thread.sleep(1000L); final long start = System.nanoTime(); action.call(); long duration = System.nanoTime() - start; long opsPerSec = (repetitions * NUM_PRODUCERS * 1000L * 1000L * 1000L) / duration; System.out.printf("Run: %d - %,d ops/sec \n", Integer.valueOf(runNum), Long.valueOf(opsPerSec)); } } /** * Baseline ops/second without a subject. * * Perf along this order of magnitude: * * Run: 10 - 316,235,532 ops/sec * Run: 11 - 301,886,792 ops/sec * Run: 12 - 310,472,228 ops/sec * Run: 13 - 313,469,797 ops/sec * Run: 14 - 305,380,809 ops/sec */ public long baseline() { LongSumObserver o = new LongSumObserver(); for (long l = 0; l < repetitions; l++) { o.onNext(l); } o.onCompleted(); return o.sum; } public Iterable<Long> ITERABLE_OF_REPETITIONS = new Iterable<Long>() { @Override public Iterator<Long> iterator() { return new Iterator<Long>() { long count = 0; @Override public boolean hasNext() { return count <= repetitions; } @Override public Long next() { return count++; } @Override public void remove() { // do nothing } }; }; }; }