2016-10-12 3 views
0

1つのカスタム実装を含む、いくつかのマップ実装のベンチマークを書きたいと思います。私は広範囲の入力に対して平均してどのように動作するかをテストしたい。1つのベンチマーク内での広範囲の入力の使用

これは初めてJMHを使用するため、@Paramを使用することは明らかな選択肢のように見えました。しかし、JMHは単一のベンチマークでこれらのさまざまな入力をすべて使用することはないが、各パラメータのセットごとに別々のベンチマークを実行することになります。

私は行方不明になっているか、ベンチマークでここでやりたいと思っている入力範囲をループしているだけなのですか?

アップデート:

私は全く逆の比較結果与える2つの異なるベンチマーク、実装

(注:これはキーとして三次元の座標を使用して、特別な地図(Mapインタフェースを実装していない)です)。

のみ1つの値を毎回取得と異なる値を毎回取得するために状態を使用したベンチマーク

@Benchmark 
public void benchmarkGet(Blackhole bh){ 
    //8*20 different starting positions 
    for(int i = 0;i < 8 * 20;i++){ 

     for(int x = 0;x < 20;x++){ 
      for(int y = 0;y < 20;y++){ 
       for(int z = 0;z < 20;z++){ 
        Object value = map.get(x + offsets[i][0], y + offsets[i][1], z + offsets[i][2])); 
        bh.consume(value); 
       } 
      } 
     } 
    } 
} 
  • に入力の範囲にわたりループ

    1. @Benchmark 
      @OutputTimeUnit(value = TimeUnit.MICROSECONDS) 
      public void benchmarkGet(Blackhole bh) { 
          Object value = map.get(x + offsets[i][0], y + offsets[i][1], z + offsets[i][2])); 
          bh.consume(value); 
          x++; 
          if (x > 20) { 
           y++; 
           x = 0; 
           if (y > 20) { 
            z++; 
            y = 0; 
            if (z > 20) { 
             i++; 
             z = 0; 
             if (i >= 8*20) { 
              i = 0; 
             } 
            } 
           } 
          } 
      } 
      

    1つは正しいですか?

  • +0

    一部のコードを表示 – dit

    +0

    注:これはまた、この質問に似ています:http://stackoverflow.com/questions/24496949/benchmarking-java-hashmap-get-jmh-vs-loopingしかし、私の答えはありません質問:正しい方法は何ですか、私はどちらを信頼すべきですか? – Barteks2x

    答えて

    0

    JMHベンチマークは、特定のコードのパフォーマンスを非常に正確に測定しようとします。

    実装が高速であるという質問は、回答が異なる可能性があるため、その質問にどの入力が含まれている場合にのみ回答できます。どのインプリメンテーションが平均的に速いのかを知るには、平均する必要のあるインプットを知る必要があります。

    そのため、実装が一般的に速いということは不可能であり、JMHはその質問に答えることを試みません。

    あなたはJMHに質問している質問に問題があります.JMHはそれが間違った質問だと思うので、「一般的に」速いです。間違った質問をするのが難しくなります。

    正しい実装では、実際には異なる値を持つParamを使用し、異なるベンチマークを取得します。ベンチマークの結果は、そこから得られる回答の範囲です。

    ベンチマークの結果を検討した結果、ある範囲の小さな入力に対してはxがはるかに速く、ある範囲の大きな入力に対してはxがはるかに遅いというような感じになるかもしれません。どのような結論から導き出しますか。ユースケースの方が速いのはユースケースでユースケースを描く必要があります。

    +0

    私はテストする入力を知っていましたが、そのような膨大な量の入力を与える正しい方法が実際にはわかりませんでした。この場合、私は実際の場合、入力は3次元空間のある点に近い3つの整数になることを知っていました。それがまさに私がテストしたかったものです。だから私は一般的にスピードをテストするのではなく、私の特定のケースでテストしています。しかし、JMHにはそれを行う標準的な方法はなく、私が思いつく2つの方法は矛盾する結果をもたらします。また、Paramを使用していくつかの入力をテストするのは時間がかかり、不正確です(データポイントが少なすぎます)。そして今でも私はどちらのマップが良いか分かりません。 – Barteks2x

    +0

    @ Barteks2x入力の範囲をテストする際の問題は、繰り返しのパフォーマンスを十分に測定している可能性があることです。それが重要であれば、反復自体が重要であり、反復はあなたのベンチマークの一部です。それはまた、測定する一つの方法が他とは異なる結果をもたらす理由を説明することもできます。あなたは.get操作と一緒に繰り返しを測定しています。セットアップするには、http://hg.openjdk.java.net/code-tools/jmh/file/ecd9e76155fe/jmh-samples/src/main/java/org/openjdk/jmh/samples/JMHSample_05_StateFixtures.javaを参照してください。状態。 – Martijn

    +0

    それは私の質問です:どのように私はちょうどget()操作を測定できますか?私が1つの "操作"でそれらの多くを測定する場合、私は操作ごとに1つだけのget()を測定し、次の操作の状態を変更する場合とは異なる結果を表示します。 どちらが良いかを確認する唯一の方法は、実際に実際にテストすることです。実際のところ、2dで同様のマップのパフォーマンスがどのようになるかはわかりません。 JMHのそれを参照してください(そして2次元バージョンはmerformanceで一致する必要があります) – Barteks2x

    関連する問題