Eug*_*ene 5 java benchmarking jmh
所以这是我试图测试的简单事情,什么是更快的mod操作或AND一个(假设2的幂) - 这就是hashMap内部的作用.这是一个拼写正确的"测试"吗?我不得不承认jmh的内部结构并且在经过所有样本(我认为第3次)之后编写正确的微基准测试是一个相当大的挑战.:)
@State(Scope.Thread)
@BenchmarkMode(org.openjdk.jmh.annotations.Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
public class MeasureSpeedModuleVsAnd {
public static void main(String[] args) throws Exception {
Options opt = new OptionsBuilder()
.include(MeasureSpeedModuleVsAnd.class.getSimpleName())
.forks(1)
.warmupIterations(1)
.measurementIterations(5)
.warmupTime(TimeValue.seconds(2))
.build();
new Runner(opt).run();
}
@Param({ "16", "32", "256", "1048576" /* 2 power of 10 */ })
public int number_of_buckets;
@Param({ "345984", "123456", "111", "98653" })
public int hashcode;
@Benchmark
public int benchamark_modulo() {
return hashcode % number_of_buckets;
}
@Benchmark
public int benchmark_and() {
return (number_of_buckets - 1) & hashcode;
}
}
Run Code Online (Sandbox Code Playgroud)
本博文中详细介绍了这一点:http://psy-lob-saw.blogspot.co.za/2014/11/the-mythical-modulo-mask.html
您的基准被打破(比较似乎无关的数量)因为您正在比较(non_final_field和constant)和(constant%non_final_field).替换为(non_final_field1%non_final_field2)和(non_final_field1&(non_final_field2-1)),其中non_final_field2是2的幂.
在HashMap的上下文中,该值用于从数组中读取,博客文章也涵盖了该方面的含义.
| 归档时间: |
|
| 查看次数: |
205 次 |
| 最近记录: |