Last active
December 31, 2015 06:47
-
-
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/)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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