如何使用 JMH 正确地对 '&' 与 '%' 成本进行基准测试
How to benchmark '&' vs '%' cost correctly, using JMH
所以这是我要测试的简单事情,mod 操作或 AND 操作(假设为 2 的幂)哪个更快 - 这就是 hashMap 在内部所做的事情。 "test" 的拼写正确吗?我不得不承认 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;
}
}
本博客对此进行了详细介绍 post:http://psy-lob-saw.blogspot.co.za/2014/11/the-mythical-modulo-mask.html
您的基准被破坏(比较看似无关的数量)因为您正在比较(non_final_field & 常数)和(常数 % non_final_field)。替换为 (non_final_field1 % non_final_field2) 和 (non_final_field1 & (non_final_field2-1)) 其中 non_final_field2 是 2 的幂。
在 HashMap 的上下文中,该值用于从数组中读取,博客 post 也涵盖了这方面的含义。
所以这是我要测试的简单事情,mod 操作或 AND 操作(假设为 2 的幂)哪个更快 - 这就是 hashMap 在内部所做的事情。 "test" 的拼写正确吗?我不得不承认 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;
}
}
本博客对此进行了详细介绍 post:http://psy-lob-saw.blogspot.co.za/2014/11/the-mythical-modulo-mask.html
您的基准被破坏(比较看似无关的数量)因为您正在比较(non_final_field & 常数)和(常数 % non_final_field)。替换为 (non_final_field1 % non_final_field2) 和 (non_final_field1 & (non_final_field2-1)) 其中 non_final_field2 是 2 的幂。
在 HashMap 的上下文中,该值用于从数组中读取,博客 post 也涵盖了这方面的含义。