2012-03-22 16 views
3

System.currentTimeMillis()(あるいはSystem.nanoTime())を使用してプログラムのパフォーマンスを時間切れにしようとしていて、実行するたびに別の結果が得られますタスクを完了します。プロセスのタイミングを合わせるときに結果が一致しない

でも簡単なテスト:

long totalTime; 
long startTime; 
long endTime; 
startTime = System.currentTimeMillis(); 
for (int i = 0; i < 1000000000; i++) 
{ 
    for (int j = 0; j < 1000000000; j++) 
    { 
    } 
} 
endTime = System.currentTimeMillis(); 
totalTime = endTime-startTime; 
System.out.println("Time: " + totalTime); 

は0から200に、異なる出力のすべての種類を生産する誰もが私が間違っているのか、別の解決策を提案しています何を言うことはできますか?

答えて

5

ループは何もしないので、ループを検出するのに要する時間は無意味です。

ループを正確にタイミング調整することはできません。再現性のある結果を得るには、やや役立つものが必要です。

32ビットウィンドウで実行している場合は、-serverを試すことをお勧めします。

十億クロックサイクルは約10年かかるので、それは何度も繰り返しません。

+0

+1計算には、10年の近似値がそれほど悪くはありません。私は、シングルスレッドの2.4GHz CPUの場合、13年間で計算しました。 –

+0

+1私はピーターが物事を劇的に控えめにしていると思う。私は最近ベンチマークを少ししましたが、JVMにはジャストインタイムオプティマイザが追加されました。このオプティマイザは、配列のどの要素を確認し、__only__の要素を調べるかを素早く見つけ出します。私はあなたが試して使うかもしれない任意の乱数ジェネレーターと一緒にカホットにいると思う。私はまたあなたが画面を見ているかどうかを知っていると思う。いくつかの実際の作業をすることを騙そうとすることを祈ってください。 – RalphChapin

+0

元々、私はものをやっている、私は3つの異なる欲張りアルゴリズム(最初のフィット、次のフィット、最高のフィット)を実装し、そのパフォーマンスをタイミングしています。問題は、他のアルゴリズムに比べて最適なフィットが速くなることがあり、最初の適合がそれを行い、(アルゴリズムのコードが正しいとは思えますが)何も意味がないことがあります。 – comeonism

2

これはまさに予想される動作です。タイミングを再実行するにつれてより速くなるはずです。何度もメソッドを再実行すると、JITはそれをネイティブコードにコンパイルして最適化するために多くの努力をします。私はこのコードを十分長く実行した後、実際に何もしないので、JITはループを完全に排除すると期待しています。

Javaコードで正確なベンチマークを取得するには、Caliperのようなツールを使用してJITを「ウォームアップ」して、コードを完全に最適化するようにしてください。

関連する問題