2016-02-17 4 views
5

ここでは、私がテストしようとしている簡単なことは、より速い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; 
    } 
} 
+3

もちろん、 'arg%33'!= '(arg-1)&33'ではありません。 '42'を例にとります... –

+0

あなたは' arg%32'と 'arg&(32-1)'を書いていましたか? –

+0

@AlekseyShipilevは完全に私の悪い、間違ったコードをコピーしました。 – Eugene

答えて

4

これは、このブログの記事で詳しく説明されて:あなたは(一定の%のnon_final_fieldで(non_final_field &定数)を比較しているためhttp://psy-lob-saw.blogspot.co.za/2014/11/the-mythical-modulo-mask.html

あなたのベンチマークが壊れている(無関係な量のように思えるものを比較します) )。 (non_final_field1%non_final_field2)で置き換えると(& non_final_field1(non_final_field2-1))non_final_field2は、アレイから読み出すためのHashMap値の文脈で2

の電力使用され、ブログポストは影響をカバーする場合その側の

関連する問題