2013-03-08 6 views
6

良い比較テストテストを書くには、数千(何百万回)実行する必要があります。それは他のプログラムの影響力を(ほとんどの場合)均等にします。良いパフォーマンス比較テストを実行するにはどうすればよいですか?

しかし、JVMが結果に影響を及ぼす可能性がある場合。たとえば:

最初のソリューションは、次のとおりです。

final StringBuilder stringBuilder = new StringBuilder(); 
    stringBuilder.append(getStrOne()); 
    stringBuilder.append(getStrTwo()); 
    final String result1 = stringBuilder.toString(); 

そして第二には、次のとおりです。

final String result2 = getStrOne() + getStrTwo(); 

私はJVMが結果に影響を与えることができるので、優れている1かわかりません。どちらが良いかを知るには?

更新日:正確にはそのものではありません。追加コンパイルテスト。私はそのようなの状況をテストするのが苦手です。

+2

JVMが意味することは、結果に影響を与える可能性がありますか? – ddmps

+1

2番目は 'final String result2 =" str1str2 ";に変換されます... – assylias

+0

@Pescis例えばキャッシュ。 –

答えて

2

私は最近、優れたIBMの記事(http://www.ibm.com/developerworks/java/library/j-benchmark1/index.html)に依存したベンチマークテストを実施しました。

記事は、たとえば、結果の精度に影響を与える可能性が落とし穴の多くを説明します

  • ランタイムコードの最適化/再コンパイル。
  • デッドコードの除去(すなわち、未使用の結果は、テストコードが削除される可能性があります)
  • ガベージコレクション
  • キャッシュ
  • ...
  • 最後に

、サイトへの記事のリンクフレームワークはdownloadedです。このフレームワークは、テストメソッドをスプールし、再コンパイルの証拠を探し、実行時間が決まるのを待つという非常にうまく機能します。

0

は、2列の場合は、パフォーマンスの違いはごくわずかですが、次のことを試してください。

String s = ""; 
for(int i = 0; i < 10000; i++) { 
    s += i; 
} 

StringBuilder b = new StringBuilder(); 
for(int i = 0; i < 10000; i++) { 
    b.append(i); 
} 

あなたは第二のループが道高速であることがわかります。どうして?文字列の連結はすべての反復で新しいStringオブジェクトを作成するため、CPUサイクルとメモリが無駄になります。

私はあなたを引用されます:

あなたはそれを数千(百万人)回をテストする必要が良いcomparationsテストテストを書くには。それは他のプログラムの影響力を(ほとんどの場合)均等にします。

同じ単一のVM内のテストに適用されます(これは精度の誤差や他の影響をタイミング意味をなさないだけ小さい部分を比較するなど、より大きなデータ、大きなループを使用して、コードを複数回テストし、例えばガベージコレクションはその間で実行されます)。

関連する問題