# HG changeset patch # User shade # Date 1483625444 -3600 # Node ID 4b6fa8cb7422df2a4a730f67ea675332b4464e8d # Parent 4016779f803c92e9bd1ece683242e40f84ea69f0 Collection traversal tests. diff -r 4016779f803c -r 4b6fa8cb7422 src/main/java/org/openjdk/gcbench/colls/HashMapTraversal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/org/openjdk/gcbench/colls/HashMapTraversal.java Thu Jan 05 15:10:44 2017 +0100 @@ -0,0 +1,47 @@ +package org.openjdk.gcbench.colls; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; + +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Fork(1) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Threads(1) +@State(Scope.Benchmark) +public class HashMapTraversal { + + Map map; + + @Param({"1", "10", "100", "1000", "10000", "100000", "1000000"}) + private int size; + + @Param({"0", "1", "10", "100"}) + private int burn; + + @Setup + public void setup() { + map = new HashMap<>(); + for (int c = 0; c < size; c++) { + map.put(c, new Object()); + } + } + + @Benchmark + public void test() { + for (Object o : map.entrySet()) { + process(o); + } + } + + @CompilerControl(CompilerControl.Mode.DONT_INLINE) + private void process(Object o) { + Blackhole.consumeCPU(burn); + } + +} diff -r 4016779f803c -r 4b6fa8cb7422 src/main/java/org/openjdk/gcbench/colls/LinkedListTraversal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/org/openjdk/gcbench/colls/LinkedListTraversal.java Thu Jan 05 15:10:44 2017 +0100 @@ -0,0 +1,46 @@ +package org.openjdk.gcbench.colls; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; + +import java.util.LinkedList; +import java.util.concurrent.TimeUnit; + +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Fork(1) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Threads(1) +@State(Scope.Benchmark) +public class LinkedListTraversal { + + LinkedList list; + + @Param({"1", "10", "100", "1000", "10000", "100000", "1000000"}) + private int size; + + @Param({"0", "1", "10", "100"}) + private int burn; + + @Setup + public void setup() { + list = new LinkedList<>(); + for (int c = 0; c < size; c++) { + list.add(new Object()); + } + } + + @Benchmark + public void test() { + for (Object o : list) { + process(o); + } + } + + @CompilerControl(CompilerControl.Mode.DONT_INLINE) + private void process(Object o) { + Blackhole.consumeCPU(burn); + } + +} diff -r 4016779f803c -r 4b6fa8cb7422 src/main/java/org/openjdk/gcbench/colls/TreeMapTraversal.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main/java/org/openjdk/gcbench/colls/TreeMapTraversal.java Thu Jan 05 15:10:44 2017 +0100 @@ -0,0 +1,47 @@ +package org.openjdk.gcbench.colls; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.Blackhole; + +import java.util.Map; +import java.util.TreeMap; +import java.util.concurrent.TimeUnit; + +@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) +@Fork(1) +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@Threads(1) +@State(Scope.Benchmark) +public class TreeMapTraversal { + + Map map; + + @Param({"1", "10", "100", "1000", "10000", "100000", "1000000"}) + private int size; + + @Param({"0", "1", "10", "100"}) + private int burn; + + @Setup + public void setup() { + map = new TreeMap<>(); + for (int c = 0; c < size; c++) { + map.put(c, new Object()); + } + } + + @Benchmark + public void test() { + for (Object o : map.entrySet()) { + process(o); + } + } + + @CompilerControl(CompilerControl.Mode.DONT_INLINE) + private void process(Object o) { + Blackhole.consumeCPU(burn); + } + +} diff -r 4016779f803c -r 4b6fa8cb7422 src/main/java/org/openjdk/gcbench/wip/LinkedListTraversal.java --- a/src/main/java/org/openjdk/gcbench/wip/LinkedListTraversal.java Thu Jan 05 13:12:38 2017 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,192 +0,0 @@ -package org.openjdk.shenandoah.wip; - -import org.openjdk.jmh.annotations.*; -import org.openjdk.jmh.infra.Blackhole; - -import java.util.LinkedList; -import java.util.concurrent.TimeUnit; - -@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) -@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS) -@Fork(value = 1, jvmArgsAppend = {"-Xmx2g", "-Xms2g"}) -@BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(TimeUnit.NANOSECONDS) -@Threads(Threads.MAX) -@State(Scope.Benchmark) -public class LinkedListTraversal { - - LinkedList list; - - @Param({"1", "10", "100", "1000"}) - private int size; - - @Param({"0", "1", "10", "100"}) - private int work; - - @Setup - public void setup() { - list = new LinkedList<>(); - for (int c = 0; c < size; c++) { - list.add(new Object()); - } - } - - @Benchmark - public void test() { - for (Object o : list) { - process(o); - } - } - - @CompilerControl(CompilerControl.Mode.DONT_INLINE) - private void process(Object o) { - Blackhole.consumeCPU(work); - } - - /* - i7 4790K, 4.0 Ghz, Linux x86_64, JDK 9 (Shenandoah, 2016-09-05) - - Benchmark (size) (work) Mode Cnt Score Error Units - - # ------------- Shenandoah - LinkedListTraversal.test 1 0 avgt 5 17.388 ± 0.424 ns/op - LinkedListTraversal.test 1 1 avgt 5 18.755 ± 0.102 ns/op - LinkedListTraversal.test 1 10 avgt 5 33.846 ± 0.185 ns/op - LinkedListTraversal.test 1 100 avgt 5 230.246 ± 4.150 ns/op - - LinkedListTraversal.test 10 0 avgt 5 126.915 ± 0.619 ns/op - LinkedListTraversal.test 10 1 avgt 5 139.774 ± 1.138 ns/op - LinkedListTraversal.test 10 10 avgt 5 299.499 ± 0.536 ns/op - LinkedListTraversal.test 10 100 avgt 5 2275.352 ± 108.207 ns/op - - LinkedListTraversal.test 100 0 avgt 5 1242.132 ± 12.020 ns/op - LinkedListTraversal.test 100 1 avgt 5 1362.940 ± 18.402 ns/op - LinkedListTraversal.test 100 10 avgt 5 2937.820 ± 88.949 ns/op - LinkedListTraversal.test 100 100 avgt 5 22461.248 ± 215.900 ns/op - - LinkedListTraversal.test 1000 0 avgt 5 12407.080 ± 784.980 ns/op - LinkedListTraversal.test 1000 1 avgt 5 13568.390 ± 69.637 ns/op - LinkedListTraversal.test 1000 10 avgt 5 28889.154 ± 156.406 ns/op - LinkedListTraversal.test 1000 100 avgt 5 224457.455 ± 1615.782 ns/op - - # ------------- G1 - LinkedListTraversal.test 1 0 avgt 5 11.554 ± 0.044 ns/op - LinkedListTraversal.test 1 1 avgt 5 13.590 ± 0.512 ns/op - LinkedListTraversal.test 1 10 avgt 5 29.012 ± 0.098 ns/op - LinkedListTraversal.test 1 100 avgt 5 224.851 ± 1.311 ns/op - - LinkedListTraversal.test 10 0 avgt 5 101.351 ± 0.610 ns/op - LinkedListTraversal.test 10 1 avgt 5 114.732 ± 0.477 ns/op - LinkedListTraversal.test 10 10 avgt 5 278.078 ± 2.164 ns/op - LinkedListTraversal.test 10 100 avgt 5 2258.527 ± 95.300 ns/op - - LinkedListTraversal.test 100 0 avgt 5 997.334 ± 3.157 ns/op - LinkedListTraversal.test 100 1 avgt 5 1129.239 ± 7.287 ns/op - LinkedListTraversal.test 100 10 avgt 5 2692.583 ± 46.002 ns/op - LinkedListTraversal.test 100 100 avgt 5 22185.850 ± 119.166 ns/op - - LinkedListTraversal.test 1000 0 avgt 5 10459.159 ± 619.495 ns/op - LinkedListTraversal.test 1000 1 avgt 5 11306.074 ± 57.860 ns/op - LinkedListTraversal.test 1000 10 avgt 5 26786.378 ± 98.852 ns/op - LinkedListTraversal.test 1000 100 avgt 5 223273.974 ± 1668.267 ns/op - - # ------------- Parallel - LinkedListTraversal.test 1 0 avgt 5 12.045 ± 0.102 ns/op - LinkedListTraversal.test 1 1 avgt 5 13.521 ± 0.109 ns/op - LinkedListTraversal.test 1 10 avgt 5 28.933 ± 0.170 ns/op - LinkedListTraversal.test 1 100 avgt 5 224.028 ± 1.007 ns/op - - LinkedListTraversal.test 10 0 avgt 5 99.943 ± 0.319 ns/op - LinkedListTraversal.test 10 1 avgt 5 113.020 ± 0.472 ns/op - LinkedListTraversal.test 10 10 avgt 5 278.874 ± 0.981 ns/op - LinkedListTraversal.test 10 100 avgt 5 2240.404 ± 68.685 ns/op - - LinkedListTraversal.test 100 0 avgt 5 984.926 ± 9.101 ns/op - LinkedListTraversal.test 100 1 avgt 5 1123.761 ± 22.491 ns/op - LinkedListTraversal.test 100 10 avgt 5 2686.100 ± 27.615 ns/op - LinkedListTraversal.test 100 100 avgt 5 22200.145 ± 137.753 ns/op - - LinkedListTraversal.test 1000 0 avgt 5 10608.240 ± 1392.802 ns/op - LinkedListTraversal.test 1000 1 avgt 5 11415.247 ± 448.812 ns/op - LinkedListTraversal.test 1000 10 avgt 5 27146.258 ± 786.984 ns/op - LinkedListTraversal.test 1000 100 avgt 5 223566.680 ± 4465.310 ns/op - - Bottom-line: Shenandoah experiences slowdowns compared to G1 and Parallel, mostly visible - when the work associated with each element is small. For "no operation" mode, the overhead - is around 25%, and explained by more instructions emitted by Shenandoah which do more - memory accesses, see: - - Benchmark (size) (work) Mode Cnt Score Error Units - - # ------------- Shenandoah - LinkedListTraversal.test 1000 0 avgt 50 12354.399 ± 23.683 ns/op - LinkedListTraversal.test:CPI 1000 0 avgt 10 0.581 ± 0.003 #/op - LinkedListTraversal.test:L1-dcache-load-misses 1000 0 avgt 10 664.917 ± 9.217 #/op - LinkedListTraversal.test:L1-dcache-loads 1000 0 avgt 10 32601.580 ± 374.103 #/op <--- !!! - LinkedListTraversal.test:L1-dcache-stores 1000 0 avgt 10 15101.405 ± 176.765 #/op - LinkedListTraversal.test:branch-misses 1000 0 avgt 10 6.186 ± 0.311 #/op - LinkedListTraversal.test:branches 1000 0 avgt 10 13746.542 ± 154.449 #/op - LinkedListTraversal.test:bus-cycles 1000 0 avgt 10 1268.583 ± 13.952 #/op - LinkedListTraversal.test:cycles 1000 0 avgt 10 45603.892 ± 502.818 #/op - LinkedListTraversal.test:dTLB-load-misses 1000 0 avgt 10 1.584 ± 0.228 #/op - LinkedListTraversal.test:dTLB-loads 1000 0 avgt 9 32488.220 ± 487.012 #/op - LinkedListTraversal.test:dTLB-store-misses 1000 0 avgt 10 0.046 ± 0.017 #/op - LinkedListTraversal.test:dTLB-stores 1000 0 avgt 10 15058.174 ± 175.262 #/op - LinkedListTraversal.test:instructions 1000 0 avgt 10 78513.188 ± 756.405 #/op <--- !!! - LinkedListTraversal.test:ref-cycles 1000 0 avgt 10 50832.373 ± 505.813 #/op - - # ------------- G1 - LinkedListTraversal.test 1000 0 avgt 50 10495.699 ± 65.219 ns/op - LinkedListTraversal.test:CPI 1000 0 avgt 10 0.618 ± 0.014 #/op - LinkedListTraversal.test:L1-dcache-load-misses 1000 0 avgt 10 377.307 ± 12.210 #/op - LinkedListTraversal.test:L1-dcache-loads 1000 0 avgt 10 22606.939 ± 518.441 #/op - LinkedListTraversal.test:L1-dcache-stores 1000 0 avgt 10 16238.168 ± 329.001 #/op - LinkedListTraversal.test:branch-misses 1000 0 avgt 10 4.739 ± 0.523 #/op - LinkedListTraversal.test:branches 1000 0 avgt 10 9589.771 ± 226.666 #/op - LinkedListTraversal.test:bus-cycles 1000 0 avgt 10 1077.738 ± 21.578 #/op - LinkedListTraversal.test:cycles 1000 0 avgt 10 38816.240 ± 706.088 #/op - LinkedListTraversal.test:dTLB-load-misses 1000 0 avgt 10 1.343 ± 0.182 #/op - LinkedListTraversal.test:dTLB-loads 1000 0 avgt 10 22527.332 ± 500.666 #/op - LinkedListTraversal.test:dTLB-store-misses 1000 0 avgt 8 0.047 ± 0.058 #/op - LinkedListTraversal.test:dTLB-stores 1000 0 avgt 8 16151.683 ± 322.656 #/op - LinkedListTraversal.test:instructions 1000 0 avgt 10 62848.740 ± 1555.431 #/op - LinkedListTraversal.test:ref-cycles 1000 0 avgt 10 43275.574 ± 748.133 #/op - - # ------------- Parallel - LinkedListTraversal.test 1000 0 avgt 50 10507.829 ± 65.413 ns/op - LinkedListTraversal.test:CPI 1000 0 avgt 10 0.617 ± 0.008 #/op - LinkedListTraversal.test:L1-dcache-load-misses 1000 0 avgt 9 379.135 ± 16.184 #/op - LinkedListTraversal.test:L1-dcache-loads 1000 0 avgt 9 22681.509 ± 390.124 #/op - LinkedListTraversal.test:L1-dcache-stores 1000 0 avgt 9 16162.990 ± 244.165 #/op - LinkedListTraversal.test:branch-misses 1000 0 avgt 10 4.777 ± 0.553 #/op - LinkedListTraversal.test:branches 1000 0 avgt 10 9537.536 ± 122.677 #/op - LinkedListTraversal.test:bus-cycles 1000 0 avgt 10 1072.327 ± 19.018 #/op - LinkedListTraversal.test:cycles 1000 0 avgt 10 38632.620 ± 934.336 #/op - LinkedListTraversal.test:dTLB-load-misses 1000 0 avgt 8 1.338 ± 0.148 #/op - LinkedListTraversal.test:dTLB-loads 1000 0 avgt 9 22627.587 ± 392.352 #/op - LinkedListTraversal.test:dTLB-store-misses 1000 0 avgt 8 0.035 ± 0.016 #/op - LinkedListTraversal.test:dTLB-stores 1000 0 avgt 9 16104.147 ± 230.044 #/op - LinkedListTraversal.test:instructions 1000 0 avgt 10 62623.520 ± 1394.639 #/op - LinkedListTraversal.test:ref-cycles 1000 0 avgt 10 42984.093 ± 1044.819 #/op - - These additional memory accesses are read barriers, e.g.: - - Shenandoah: - - 0.88% 0.54% 0x00007f2029549703: mov -0x8(%rcx),%r10 ; implicit exception: dispatches to 0x00007f2029549cb9 - 1.18% 0.95% 0x00007f2029549707: mov 0x10(%r10),%r10d ;*getfield next {reexecute=0 rethrow=0 return_oop=0} - ; - java.util.LinkedList$ListItr::next@32 (line 897) - ; - org.openjdk.shenandoah.scenarios.LinkedListTraversal::test@18 (line 36) - ; - org.openjdk.shenandoah.scenarios.generated.LinkedListTraversal_test_jmhTest::test_avgt_jmhStub@15 (line 213) - - G1/Parallel: - - 0.95% 0.72% 0x00007fe7c554707b: mov 0x10(%r11),%r10d ;*getfield next {reexecute=0 rethrow=0 return_oop=0} - ; - java.util.LinkedList$ListItr::next@32 (line 897) - ; - org.openjdk.shenandoah.scenarios.LinkedListTraversal::test@18 (line 36) - ; - org.openjdk.shenandoah.scenarios.generated.LinkedListTraversal_test_jmhTest::test_avgt_jmhStub@15 (line 213) - ; implicit exception: dispatches to 0x00007fe7c5547305 - - */ - -}