edwardbeckett
12/31/2015 - 5:16 AM

JMH 1.11.2 ~ GenericsBench ~ Testing an assertion from a 2009 AMD article :: A Java Generics Performance Puzzler (http://developer.amd.com

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 <Edward@EdwardBeckett.com>
 * @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