2

次のプロパティを持つ測定値のリストがあります。

  1. 測定は高価です。測定が少ない -> より良い
  2. それらはすべてポジティブです。実際、正の下限があり、それ以下の値を取得することはできません。この下限は、自信を持って知る必要があるものです。
  3. それらは、1 つ以上の中央値の周りに分布します
  4. median - 2*variance「最良の」中央値と下限の間の距離が常に正規分布の幅の 2 倍よりも小さいため、外れ値を見つけると、別の「より良い」中央値があることがわかります。

目標: 反復回数が最小で、信頼度が 90% の最適な中央値を見つけます。

私は最小値を好みますが、最小の中央値で十分です。

私が探しているのは、測定値をフィードし、中央値と、この中央値が私が求めているものであるという自信の程度を教えてくれるコードです。

背景: Java メソッドの時間を測定したい。異常値を平均化するために数分間テストを実行することもできますが、データを見ると、値が中央値の周りに急速に蓄積されることが人間には明らかです。

JITが作動して中央値が突然ジャンプしない限り。最終的には、最小の中央値の左側が非常に急な曲線 (つまり、中央値の左側の分散が小さい) になり、右側は長くて緩やかな勾配になり、pre-JIT が中央値でした。

サンプルテストデータ (13KB)

testConnect-count.csvは値のヒストグラム、testConnect-history.csvは一連の測定値です。115000目標は、から最小数の値を読み取ることによって、より小さな中央値を返すアルゴリズムを見つけることです。testConnect-history.csv

4

2 に答える 2

1

実際の質問は、JIT 最適化後のサブプログラムの平均実行を教えてください。

プロセスは定常的ではありません。JIT が開始されるまでの時間は、実際の仮想マシンの実装とテスト対象のプログラムによって異なります。汎用的な魔法の弾丸の方法は見つからないと思います。

実験する必要があります。決まった数の測定を捨て、決まった数の測定を行い、外れ値を捨て、残りの平均をとってみます。

于 2012-09-13T20:16:26.930 に答える
1

パーセンタイルは正規分布に従わないため、レイテンシーのパーセンタイルを見るのが一般的な方法であり、レイテンシーが長くなると害になると思います。

あなたの場合、50 パーセンタイルと 90 パーセンタイルを使用できます。

ソートされたコレクションがある場合、これらは簡単に計算できます

List<Long> times = ....
Collections.sort(times);
long median = times.get(times.size()/2);
long ninetyth = times.get(times.size()*9/10);

タイミングに敏感なテストではより効率的なため、trove を使用します。オブジェクトを作成する代わりに、プリミティブ値を使用します。

TLongArrayList times = 
times.sort();
long median = times.get(times.size()/2);
long ninetyth = times.get(times.size()*9/10);
long ninetynineth = times.get(times.size()*99/100);

あなたの場合、中央値は 116000 で、90% タイルは 170000 です。99% タイルは 255000 です。

于 2012-09-13T15:53:22.820 に答える