1

Ok。私はマイクロベンチマークの計算を誤解しています。あなたが余分な時間を持っていない場合、Plzは読まないでください。

それ以外の

double[] my_array=new array[1000000];double blabla=0;
for(int i=0;i<1000000;i++)
{
  my_array[i]=Math.sqrt(i);//init
}

for(int i=0;i<1000000;i++)
{
  blabla+=my_array[i];//array access time is 3.7ms per 1M operation
}

使った

public final static class my_class
{
 public static double element=0;
 my_class(double elementz)
 {
 element=elementz;
 }
}

my_class[] class_z=new my_class[1000000];
for(int i=0;i<1000000;i++)
{
class_z[i]=new my_class(Math.sqrt(i)); //instantiating array elements for later use(random-access)
}

double blabla=0;

for(int i=0;i<1000000;i++)
{
blabla+=class_z[i].element; // array access time 2.7 ms per 1M operations.
}
}

ループオーバーヘッドは、1Mループ反復あたり約0.5ミリ秒です(このオフセットを使用)。

クラスの要素の要素アクセス時間は、プリミティブ配列よりも%25低くなっています。質問:ランダムアクセス時間をさらに短縮する他の方法を知っていますか?intel2Ghzシングルコアjava-eclipse

4

3 に答える 3

2

コードをもう一度見ると、最初のループで1mの異なる要素を追加していることがわかります。2番目の例では、同じstatic要素を1m回追加しています。


マイクロベンチマークの一般的な問題は、テストを実行する順序が結果に影響を与えることです。

たとえば、ループが2つある場合、最初のループは最初はネイティブコードにコンパイルされません。ただし、しばらくすると、メソッド全体がコンパイルされ、ループがより高速に実行されます。

次に、2番目のループを実行して、どちらかであることがわかります。

  • 最初から最適化されているため、はるかに高速です。(単純なループの場合)
  • ランタイムメトリックなしで最適化されるため、はるかに遅くなります。(複雑なループの場合)

再現可能な結果を​​得るには、各ループを別々のメソッドに配置し、テストを数回交互に実行する必要があります。


最初のケースでは、ループはしばらく実行されるまで最適化されません。2番目のケースでは、ループの開始時にループがすでにコンパイルされている可能性があります。

于 2012-06-28T15:35:57.210 に答える
1

違いは簡単に説明できます。

  • プリミティブアレイのメモリフットプリントは1M*8バイト=8MBです。
  • クラス配列のメモリフットプリントは1M*4バイト=4MBで、すべて同じインスタンスを指します(32ビットVMまたは圧縮参照64ビットVMを想定)。

さまざまなオブジェクトをクラス配列に配置すると、プリミティブ配列のパフォーマンスが向上することがわかります。現在、オレンジとリンゴを比較しています。

于 2012-06-28T15:52:44.457 に答える
0

上記のベンチマークと評価にはいくつかの問題があります。まず、コードが図のようにコンパイルされません。第2に、ベンチマーク時間(つまり、数ミリ秒)は短すぎて、今日の高速プロセッサでは統計的に価値がありません。第三に、リンゴとオレンジを比較しています(前述のとおり)。つまり、1つの静的変数と100万の変数という、まったく異なる2つのユースケースのタイミングを計っています。

コードを修正し、i7-2620mで10,000x1,000,000回繰り返し実行しました。すべての結果は+/-1%以内でした。これは、この議論には十分です。次に、パフォーマンスを比較するために、これらすべての実行の中で最速を取りました。

上記で、2番目のユースケースは最初のユースケースよりも「25%低い」と主張しました。それは非常に不正確です。

「静的」と「可変」のパフォーマンス比較を行うために、最初のベンチマークを変更して、2番目のベンチマークと同じように999,999平方根を追加しました。違いは、2番目のユースケースを支持してわずか約4.63%でした。

配列アクセスのパフォーマンスを比較するために、2番目のユースケースを「非静的」変数に変更しました。違いは、最初のユースケース(プリミティブアレイアクセス)を支持して約68.2%でした。これは、最初の方法が2番目の方法よりもはるかに高速であることを意味します。

(私は25年以上パフォーマンスの測定と評価を行ってきたので、マイクロベンチマークについて詳しく質問してください。)

于 2013-01-25T21:28:45.527 に答える