3

誰でもこの質問を手伝ってもらえますか。単一のメソッドで簡単なベンチマークを作成します

public void timeIntArrayBlockingQueue(int reps) {
  for (int i = 0; i < reps; i++) {
    for (int j = 0; j < length; j++)
       queue.add(data[j]);
       Integer value;
       while ((value = queue.poll()) != 101) {}
    }
}

ArrayBlockingQueue の場合、結果を取得します。

0% Scenario{vm=java, trial=0, benchmark=IntArrayBlockingQueue, length=100} 5480.41 ns; σ=311.51 ns @ 10 trials

33% Scenario{vm=java, trial=0, benchmark=IntArrayBlockingQueue, length=1000} 56579.97 ns; σ=5530.23 ns @ 10 trials

67% Scenario{vm=java, trial=0, benchmark=IntArrayBlockingQueue, length=10000} 553782.25 ns; σ=27212.56 ns @ 10 trials

length     us linear runtime
   100   5.48 =
  1000  56.58 ===
 10000 553.78 ==============================

vm: java
trial: 0
benchmark: IntArrayBlockingQueue

この数字 (5480.41ns 56579.97ns 553782.25ns) が正確に意味するもの。

0% シナリオ メソッド timeIntArrayBlockingQueue は、パラメーターの長さ = 100 で 10 回呼び出されました。
(timeIntArrayBlockingQueue(100) - 10 時間 )

33% シナリオ メソッド timeIntArrayBlockingQueue は、パラメーターの長さ = 1000 で 10 回呼び出されました (timeIntArrayBlockingQueue(1000) - 10 time ) 。.

このベンチマークの結果をどのように解釈しますか?

4

1 に答える 1

4

パーセンテージは単なる進行状況です。つまり、その後は何も興味深いものではありません。

この数字 (5480.41ns 56579.97ns 553782.25ns) が正確に意味するもの。

これは、1 回の反復の平均期間、つまり の期間を でtimeXXX割ったものrepです。

標準偏差σ=311.51 nsです。一種の絶対誤差です。1 に近づくと、何かがおかしいと確信できます。σ/measured_time

ベンチマーク = IntArrayBlockingQueue、長さ = 100

これはベンチマークの名前であり、たとえば を介して指定されたパラメーター@Paramです。


重要な部分

メソッドに何も返させないtimeXXXでください。代わりに、計算して何らかの結果を返して、計算全体が最適化されていないことを確認してください。あなたのメソッドの本体は次のようなものでなければなりません

...
while ((value = queue.poll()) != 101) {
    result += value;
}

単一の追加と を一緒に使用しInteger.getValue()ても、速度が大幅に低下することはほとんどありません。少しはできますが、ベンチマークはこの方法でもう少し現実的になります (ポーリングされた値を使用しますよね)。通常、複数のベンチマークを実行して結果を比較し、最速のバリアントを選択できるようにします (実際には、通常、ベンチマークは必要ありません)。

とにかく、ループは奇妙です。通常、キューには要素が1つしかありません...

于 2012-09-22T21:46:56.480 に答える