package fj.data;
/**
* Difference List performance benchmarks comparing DList to Seq and List
* over 10 runs for the methods range, append and unbox.
*
* @author clintonselke
*/
public class DListPerformance {
static final int TOTAL_RUNS = 10;
private interface BenchmarkMethods<C> {
C range(int from, int to);
C append(C a, C b);
List<Integer> unbox(C a);
}
private static final BenchmarkMethods<List<Integer>> listMethods = new BenchmarkMethods<List<Integer>>() {
@Override
public List<Integer> range(int from, int to) {
return List.range(from, to);
}
@Override
public List<Integer> append(List<Integer> a, List<Integer> b) {
return a.append(b);
}
@Override
public List<Integer> unbox(List<Integer> a) {
return a;
}
};
private static final BenchmarkMethods<Seq<Integer>> seqMethods = new BenchmarkMethods<Seq<Integer>>() {
@Override
public Seq<Integer> range(int from, int to) {
return Seq.iterableSeq(List.range(from, to));
}
@Override
public Seq<Integer> append(Seq<Integer> a, Seq<Integer> b) {
return a.append(b);
}
@Override
public List<Integer> unbox(Seq<Integer> a) {
return a.toList();
}
};
private static final BenchmarkMethods<DList<Integer>> dListMethods = new BenchmarkMethods<DList<Integer>>() {
@Override
public DList<Integer> range(int from, int to) {
return DList.listDList(List.range(from, to));
}
@Override
public DList<Integer> append(DList<Integer> a, DList<Integer> b) {
return a.append(b);
}
@Override
public List<Integer> unbox(DList<Integer> a) {
return a.run();
}
};
private static <C> double benchmark(BenchmarkMethods<C> methods) {
long msStart = System.currentTimeMillis();
for (int runNumber = 0; runNumber < TOTAL_RUNS; ++runNumber) {
final C xs = methods.range(0, 100);
C r = xs;
for (int i = 1; i < 2000; ++i) {
r = methods.append(r, xs);
}
List<Integer> r2 = methods.unbox(r);
for (Integer x : r2) {}
}
long msEnd = System.currentTimeMillis();
return (msEnd - msStart) / ((double) TOTAL_RUNS);
}
public static void main(String[] params) {
System.out.println("Starting difference list (DList) performance benchmark...");
// warm up
System.out.println("warm up...");
benchmark(listMethods);
benchmark(seqMethods);
benchmark(dListMethods);
// actual run
System.out.println("running benchmark...");
double listTime = benchmark(listMethods);
double seqTime = benchmark(seqMethods);
double dListTime = benchmark(dListMethods);
System.out.println("Average over " + TOTAL_RUNS + " runs...");
System.out.println("List: " + listTime + "ms");
System.out.println("Seq: " + seqTime + "ms");
System.out.println("DList: " + dListTime + "ms");
}
}