ここでは、私がテストしようとしている簡単なことは、より速いmodオペレーションかAND(2の累乗を仮定) hashMapは内部的に行います。これはスペルの正しい「テスト」ですか?私はjmhの内部がすべてのサンプルを通過した後に正しいマイクロベンチマークを書くことを認める必要があります(私が思う3番目の時間)はかなり難しいことです。 :)JMHを使用して '&' vs '%'コストを正しくベンチマークする方法
@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;
}
}
もちろん、 'arg%33'!= '(arg-1)&33'ではありません。 '42'を例にとります... –
あなたは' arg%32'と 'arg&(32-1)'を書いていましたか? –
@AlekseyShipilevは完全に私の悪い、間違ったコードをコピーしました。 – Eugene