generate random lists for benchmarks

turns out this changes the performance characteristics dramatically
This commit is contained in:
2020-11-07 17:28:30 +01:00
parent 50d2901b72
commit c6d0182af7

View File

@@ -2,6 +2,7 @@ package org.lucares.collections;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.stream.LongStream; import java.util.stream.LongStream;
@@ -22,25 +23,34 @@ import org.openjdk.jmh.annotations.Warmup;
@BenchmarkMode(Mode.Throughput) @BenchmarkMode(Mode.Throughput)
@Warmup(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS) @Warmup(iterations = 10, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@Measurement(iterations = 5, time = 500, timeUnit = TimeUnit.MILLISECONDS) @Measurement(iterations = 5, time = 500, timeUnit = TimeUnit.MILLISECONDS)
@Fork(3) @Fork(2)
public class BenchmarkMultiwayMerge { public class BenchmarkMultiwayMerge {
@Param({ "10000"/*, "20000" */}) @Param({ "10000" , "20000" })
private int values; private int values;
@Param({/*"3","5",*/"10"}) @Param({ "3","5", "10","20" })
private int numLists; private int numLists;
@Param({ "true" })
private boolean random;
private List<LongList> longSorted = null; private List<LongList> longSorted = null;
@Setup @Setup
public void setup() throws Exception { public void setup() throws Exception {
ThreadLocalRandom rng = ThreadLocalRandom.current();
longSorted = new ArrayList<>(); longSorted = new ArrayList<>();
for (int i = 0; i < numLists; i++) { for (int i = 0; i < numLists; i++) {
LongList list = LongList.of(); LongList list = new LongList(values);
LongStream.range(0, values).forEachOrdered(list::add); if (random) {
for (int j = 0; j < values; j++) {
list.add(rng.nextLong());
}
list.sort(); list.sort();
} else {
LongStream.range(0, values).forEachOrdered(list::add);
}
longSorted.add(list); longSorted.add(list);
} }
} }
@@ -56,7 +66,7 @@ public class BenchmarkMultiwayMerge {
LongList.union(longSorted); LongList.union(longSorted);
} }
//@Benchmark @Benchmark
public void testUnionSortedLists_TwowayMergeImplementation() throws Exception { public void testUnionSortedLists_TwowayMergeImplementation() throws Exception {
twowayMerge(longSorted); twowayMerge(longSorted);
@@ -72,12 +82,24 @@ public class BenchmarkMultiwayMerge {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
System.out.println("\n\n----------------\nstart"); System.out.println("\n\n----------------\nstart");
// -XX:+PrintCompilation // -XX:+PrintCompilation
for (int i = 0; i < 200; i++) {
if (args != null) {
BenchmarkMultiwayMerge benchmark = new BenchmarkMultiwayMerge(); BenchmarkMultiwayMerge benchmark = new BenchmarkMultiwayMerge();
benchmark.numLists = 10;
benchmark.values = 10000;
benchmark.setup(); benchmark.setup();
//System.out.println("\n\n----------------\n"+i);
for (int j = 0; j < 100000; j++) {
benchmark.testUnionSortedLists_MultiwayMerge(); benchmark.testUnionSortedLists_MultiwayMerge();
} else {
for (int i = 0; i < 8; i++) {
BenchmarkMultiwayMerge benchmark = new BenchmarkMultiwayMerge();
benchmark.numLists = 10;
benchmark.values = 10000;
benchmark.setup();
System.out.println("\n\n----------------\n" + i);
for (int j = 0; j < 1000; j++) {
// benchmark.testUnionSortedLists_MultiwayMerge();
benchmark.testUnionSortedLists_TwowayMergeImplementation();
}
} }
} }
System.out.println("done"); System.out.println("done");