package benchmark;
import static java.util.stream.IntStream.range;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.javersion.util.PersistentHashMap;
import org.openjdk.jmh.annotations.*;
import org.openjdk.jmh.infra.Blackhole;
import org.openjdk.jmh.runner.Runner;
import org.openjdk.jmh.runner.RunnerException;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;
import clojure.lang.IPersistentMap;
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Fork(1)
@State(Scope.Benchmark)
public class ClojureHashMap {
@Param({"1", "2", "4", "8",
"10", "20", "40", "80",
"100", "200", "400", "800",
"1000", "2000", "4000", "8000", })
public int size;
private PersistentHashMap<Integer, Integer> javersionMap;
private IPersistentMap clojureMap;
@Setup
public void setup() {
javersionMap = PersistentHashMap.empty();
clojureMap = clojure.lang.PersistentHashMap.EMPTY;
range(0, size).forEach(val -> {
javersionMap = javersionMap.assoc(val, val);
clojureMap = clojureMap.assoc(val, val);
});
}
@Benchmark
public void entryIteratorJaversion(Blackhole bh) {
int count = 0;
for (Iterator<Map.Entry<Integer, Integer>> iter = javersionMap.iterator(); iter.hasNext(); ) {
bh.consume(iter.next());
count++;
}
if (count != size) {
throw new IllegalStateException("Illegal count!");
}
}
@Benchmark
public void entryIteratorClojure(Blackhole bh) {
int count = 0;
for (Iterator iter = clojureMap.iterator(); iter.hasNext(); ) {
bh.consume((Map.Entry) iter.next());
count++;
}
if (count != size) {
throw new IllegalStateException("Illegal count!");
}
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(ClojureHashMap.class.getSimpleName())
.build();
new Runner(opt).run();
}
}