add simple benchmarking helper
This commit is contained in:
@@ -0,0 +1,88 @@
|
|||||||
|
package org.lucares.collections;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.DoubleSummaryStatistics;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
public class BenchmarkHarness<T> {
|
||||||
|
|
||||||
|
static class IntListPair {
|
||||||
|
IntList a, b;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Generator<T> {
|
||||||
|
T generateInput();
|
||||||
|
}
|
||||||
|
|
||||||
|
interface Invocation<T> {
|
||||||
|
void run(T input);
|
||||||
|
}
|
||||||
|
|
||||||
|
public <P> void test(final String name, final Generator<P> generator, final Invocation<P> invoker,
|
||||||
|
final int iterations) {
|
||||||
|
|
||||||
|
final List<Double> durationsInMs = new ArrayList<>();
|
||||||
|
|
||||||
|
for (int i = 0; i < iterations; i++) {
|
||||||
|
final P input = generator.generateInput();
|
||||||
|
|
||||||
|
final long start = System.nanoTime();
|
||||||
|
|
||||||
|
invoker.run(input);
|
||||||
|
|
||||||
|
final long duration = (System.nanoTime() - start);
|
||||||
|
|
||||||
|
durationsInMs.add(duration / 1_000_000.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
final DoubleSummaryStatistics statistics = durationsInMs.stream().mapToDouble(l -> l).summaryStatistics();
|
||||||
|
|
||||||
|
System.out.println(name + ": " + statistics.toString());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void main(final String[] args) {
|
||||||
|
final BenchmarkHarness<Object> harness = new BenchmarkHarness<>();
|
||||||
|
|
||||||
|
final Generator<IntList> generatorSorted = () -> {
|
||||||
|
final int values = 100_000;
|
||||||
|
final IntList result = IntList.of();
|
||||||
|
IntStream.range(0, values).forEachOrdered(i -> result.add(i));
|
||||||
|
result.sort();
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
final Generator<IntList> generatorUnsorted = () -> {
|
||||||
|
final IntList result = generatorSorted.generateInput();
|
||||||
|
result.shuffle();
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
final Generator<IntListPair> generatorSortedPair = () -> {
|
||||||
|
final IntListPair result = new IntListPair();
|
||||||
|
|
||||||
|
result.a = generatorSorted.generateInput();
|
||||||
|
result.b = generatorSorted.generateInput();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
final Generator<IntListPair> generatorUnsortedPair = () -> {
|
||||||
|
final IntListPair result = new IntListPair();
|
||||||
|
|
||||||
|
result.a = generatorUnsorted.generateInput();
|
||||||
|
result.b = generatorUnsorted.generateInput();
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
|
||||||
|
final Invocation<IntListPair> union = p -> IntList.union(p.a, p.b);
|
||||||
|
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
harness.test("union(): unsorted" + i, generatorUnsortedPair, union, 100);
|
||||||
|
}
|
||||||
|
for (int i = 0; i < 10; i++) {
|
||||||
|
harness.test("union(): sorted" + i, generatorSortedPair, union, 100);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user