Skip to content

Instantly share code, notes, and snippets.

@edwardbeckett
Last active December 31, 2015 06:47
Show Gist options
  • Save edwardbeckett/17287cdc6ea055631294 to your computer and use it in GitHub Desktop.
Save edwardbeckett/17287cdc6ea055631294 to your computer and use it in GitHub Desktop.
JMH 1.11.2 ~ GenericsBench ~ Testing an assertion from a 2009 AMD article :: A Java Generics Performance Puzzler (http://developer.amd.com/community/blog/2009/06/05/a-java-generics-performance-puzzler/)
import java.util.ArrayList;
import java.util.concurrent.TimeUnit;
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;
/**
* Build and run jar `java -jar benchmarks.jar GenericsBench -f 4 -wi 10 -i 10 -o GenericsBench.csv`
*
* @author Edward Beckett <[email protected]>
* @since 12/30/2015
*/
@State(Scope.Thread)
@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class GenericsBench {
private ArrayList<MyClass> aListSrc, aListDest1, aListDest2;
private int NUMOBJS, idxSrc;
@Setup
public void init() {
aListSrc = new ArrayList<>();
aListDest1 = new ArrayList<>();
aListDest2 = new ArrayList<>();
while (aListSrc.size() <= 10) {
aListSrc.add(new MyClass());
}
NUMOBJS = aListSrc.size();
}
@Benchmark
public void versionOneBench(Blackhole bh) {
versionOne();
bh.consume( aListSrc);
}
@Benchmark
public void versionTwoBench(Blackhole bh) {
versionTwo();
bh.consume( aListSrc);
}
@CompilerControl(CompilerControl.Mode.DONT_INLINE)
public void versionOne() {
while (idxSrc < NUMOBJS) {
if (idxSrc % 2 == 0) {
aListDest1.add(aListSrc.get(idxSrc++));
} else {
aListDest2.add(aListSrc.get(idxSrc++));
}
++idxSrc;
}
}
@CompilerControl(CompilerControl.Mode.DONT_INLINE)
public void versionTwo() {
while (idxSrc < NUMOBJS) {
MyClass myc = aListSrc.get(idxSrc++);
if (idxSrc % 2 == 0) {
aListDest1.add(myc);
} else {
aListDest2.add(myc);
}
++idxSrc;
}
}
@State(Scope.Thread)
public static class MyClass {
private static final long serialVersionUid = 42L;
private long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof MyClass)) return false;
MyClass myClass = (MyClass) o;
if (id != myClass.id) return false;
return true;
}
@Override
public int hashCode() {
return (int) (id ^ (id >>> 32));
}
}
public static void main(String[] args) throws RunnerException {
Options opt = new OptionsBuilder()
.include(GenericsBench.class.getSimpleName())
.warmupIterations(10)
.measurementIterations(10)
.forks(4)
.build();
new Runner(opt).run();
}
}
# VM version: JDK 1.8.0_66 VM 25.66-b17
# VM invoker: c:\Java\jdk_8\jre\bin\java.exe
# VM options: <none>
# Warmup: 10 iterations 1 s each
# Measurement: 10 iterations 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread will synchronize iterations
# Benchmark mode: Average time time/op
# Benchmark: com.beckett.GenericsBench.versionOneBench
# Run progress: 0.00% complete ETA 00:02:40
# Fork: 1 of 4
# Warmup Iteration 1: 6.384 ns/op
# Warmup Iteration 2: 6.472 ns/op
# Warmup Iteration 3: 4.848 ns/op
# Warmup Iteration 4: 4.828 ns/op
# Warmup Iteration 5: 4.770 ns/op
# Warmup Iteration 6: 4.762 ns/op
# Warmup Iteration 7: 5.000 ns/op
# Warmup Iteration 8: 4.856 ns/op
# Warmup Iteration 9: 4.805 ns/op
# Warmup Iteration 10: 4.769 ns/op
Iteration 1: 4.717 ns/op
Iteration 2: 4.867 ns/op
Iteration 3: 5.602 ns/op
Iteration 4: 4.789 ns/op
Iteration 5: 4.785 ns/op
Iteration 6: 4.772 ns/op
Iteration 7: 4.665 ns/op
Iteration 8: 4.932 ns/op
Iteration 9: 4.661 ns/op
Iteration 10: 4.747 ns/op
# Run progress: 12.50% complete ETA 00:02:24
# Fork: 2 of 4
# Warmup Iteration 1: 6.085 ns/op
# Warmup Iteration 2: 6.326 ns/op
# Warmup Iteration 3: 5.187 ns/op
# Warmup Iteration 4: 4.841 ns/op
# Warmup Iteration 5: 4.745 ns/op
# Warmup Iteration 6: 4.825 ns/op
# Warmup Iteration 7: 5.048 ns/op
# Warmup Iteration 8: 5.287 ns/op
# Warmup Iteration 9: 4.808 ns/op
# Warmup Iteration 10: 4.869 ns/op
Iteration 1: 4.730 ns/op
Iteration 2: 4.803 ns/op
Iteration 3: 5.058 ns/op
Iteration 4: 4.782 ns/op
Iteration 5: 4.849 ns/op
Iteration 6: 4.877 ns/op
Iteration 7: 4.742 ns/op
Iteration 8: 4.971 ns/op
Iteration 9: 4.695 ns/op
Iteration 10: 4.691 ns/op
# Run progress: 25.00% complete ETA 00:02:03
# Fork: 3 of 4
# Warmup Iteration 1: 6.343 ns/op
# Warmup Iteration 2: 6.091 ns/op
# Warmup Iteration 3: 5.051 ns/op
# Warmup Iteration 4: 4.679 ns/op
# Warmup Iteration 5: 4.706 ns/op
# Warmup Iteration 6: 4.725 ns/op
# Warmup Iteration 7: 4.689 ns/op
# Warmup Iteration 8: 5.064 ns/op
# Warmup Iteration 9: 4.676 ns/op
# Warmup Iteration 10: 4.735 ns/op
Iteration 1: 4.943 ns/op
Iteration 2: 4.740 ns/op
Iteration 3: 5.045 ns/op
Iteration 4: 4.748 ns/op
Iteration 5: 4.733 ns/op
Iteration 6: 4.714 ns/op
Iteration 7: 4.790 ns/op
Iteration 8: 5.098 ns/op
Iteration 9: 4.848 ns/op
Iteration 10: 4.728 ns/op
# Run progress: 37.50% complete ETA 00:01:42
# Fork: 4 of 4
# Warmup Iteration 1: 6.731 ns/op
# Warmup Iteration 2: 6.077 ns/op
# Warmup Iteration 3: 5.080 ns/op
# Warmup Iteration 4: 4.754 ns/op
# Warmup Iteration 5: 4.834 ns/op
# Warmup Iteration 6: 4.751 ns/op
# Warmup Iteration 7: 4.857 ns/op
# Warmup Iteration 8: 4.982 ns/op
# Warmup Iteration 9: 4.908 ns/op
# Warmup Iteration 10: 4.789 ns/op
Iteration 1: 4.841 ns/op
Iteration 2: 4.744 ns/op
Iteration 3: 4.845 ns/op
Iteration 4: 4.944 ns/op
Iteration 5: 4.768 ns/op
Iteration 6: 4.799 ns/op
Iteration 7: 4.663 ns/op
Iteration 8: 4.720 ns/op
Iteration 9: 4.927 ns/op
Iteration 10: 4.652 ns/op
Result versionOneBench:
4.826 ±(99.9%) 0.095 ns/op [Average]
(min avg max) = (4.652 4.826 5.602) stdev = 0.169
CI (99.9%): [4.731 4.920] (assumes normal distribution)
# JMH 1.11.2 (released 63 days ago)
# VM version: JDK 1.8.0_66 VM 25.66-b17
# VM invoker: c:\Java\jdk_8\jre\bin\java.exe
# VM options: <none>
# Warmup: 10 iterations 1 s each
# Measurement: 10 iterations 1 s each
# Timeout: 10 min per iteration
# Threads: 1 thread will synchronize iterations
# Benchmark mode: Average time time/op
# Benchmark: com.beckett.GenericsBench.versionTwoBench
# Run progress: 50.00% complete ETA 00:01:21
# Fork: 1 of 4
# Warmup Iteration 1: 6.099 ns/op
# Warmup Iteration 2: 6.128 ns/op
# Warmup Iteration 3: 4.872 ns/op
# Warmup Iteration 4: 4.931 ns/op
# Warmup Iteration 5: 4.753 ns/op
# Warmup Iteration 6: 4.738 ns/op
# Warmup Iteration 7: 4.781 ns/op
# Warmup Iteration 8: 4.856 ns/op
# Warmup Iteration 9: 4.981 ns/op
# Warmup Iteration 10: 4.737 ns/op
Iteration 1: 4.812 ns/op
Iteration 2: 4.744 ns/op
Iteration 3: 4.810 ns/op
Iteration 4: 4.963 ns/op
Iteration 5: 4.745 ns/op
Iteration 6: 4.742 ns/op
Iteration 7: 4.690 ns/op
Iteration 8: 4.856 ns/op
Iteration 9: 4.990 ns/op
Iteration 10: 4.775 ns/op
# Run progress: 62.50% complete ETA 00:01:01
# Fork: 2 of 4
# Warmup Iteration 1: 6.082 ns/op
# Warmup Iteration 2: 6.110 ns/op
# Warmup Iteration 3: 4.823 ns/op
# Warmup Iteration 4: 4.954 ns/op
# Warmup Iteration 5: 4.769 ns/op
# Warmup Iteration 6: 4.735 ns/op
# Warmup Iteration 7: 4.687 ns/op
# Warmup Iteration 8: 4.816 ns/op
# Warmup Iteration 9: 4.896 ns/op
# Warmup Iteration 10: 4.750 ns/op
Iteration 1: 4.726 ns/op
Iteration 2: 4.772 ns/op
Iteration 3: 4.818 ns/op
Iteration 4: 4.860 ns/op
Iteration 5: 4.736 ns/op
Iteration 6: 4.731 ns/op
Iteration 7: 4.716 ns/op
Iteration 8: 4.669 ns/op
Iteration 9: 5.150 ns/op
Iteration 10: 4.836 ns/op
# Run progress: 75.00% complete ETA 00:00:40
# Fork: 3 of 4
# Warmup Iteration 1: 6.139 ns/op
# Warmup Iteration 2: 6.126 ns/op
# Warmup Iteration 3: 5.139 ns/op
# Warmup Iteration 4: 5.254 ns/op
# Warmup Iteration 5: 5.077 ns/op
# Warmup Iteration 6: 5.069 ns/op
# Warmup Iteration 7: 5.024 ns/op
# Warmup Iteration 8: 4.820 ns/op
# Warmup Iteration 9: 5.269 ns/op
# Warmup Iteration 10: 4.842 ns/op
Iteration 1: 4.897 ns/op
Iteration 2: 4.735 ns/op
Iteration 3: 5.067 ns/op
Iteration 4: 5.152 ns/op
Iteration 5: 5.206 ns/op
Iteration 6: 4.824 ns/op
Iteration 7: 4.604 ns/op
Iteration 8: 4.654 ns/op
Iteration 9: 4.708 ns/op
Iteration 10: 4.814 ns/op
# Run progress: 87.50% complete ETA 00:00:20
# Fork: 4 of 4
# Warmup Iteration 1: 6.110 ns/op
# Warmup Iteration 2: 6.056 ns/op
# Warmup Iteration 3: 4.714 ns/op
# Warmup Iteration 4: 4.828 ns/op
# Warmup Iteration 5: 4.834 ns/op
# Warmup Iteration 6: 4.716 ns/op
# Warmup Iteration 7: 4.690 ns/op
# Warmup Iteration 8: 4.726 ns/op
# Warmup Iteration 9: 4.775 ns/op
# Warmup Iteration 10: 4.833 ns/op
Iteration 1: 4.720 ns/op
Iteration 2: 4.778 ns/op
Iteration 3: 4.714 ns/op
Iteration 4: 4.812 ns/op
Iteration 5: 4.908 ns/op
Iteration 6: 4.758 ns/op
Iteration 7: 4.700 ns/op
Iteration 8: 4.673 ns/op
Iteration 9: 5.021 ns/op
Iteration 10: 4.959 ns/op
Result versionTwoBench:
4.821 ±(99.9%) 0.081 ns/op [Average]
(min avg max) = (4.604 4.821 5.206) stdev = 0.144
CI (99.9%): [4.740 4.902] (assumes normal distribution)
# Run complete. Total time: 00:02:42
Benchmark Mode Cnt Score Error Units
GenericsBench.versionOneBench avgt 40 4.826 ± 0.095 ns/op
GenericsBench.versionTwoBench avgt 40 4.821 ± 0.081 ns/op
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment