2012-03-15 2 views
0

プログラミング言語のクロック時間に問題が発生したのは初めてです。基本的には、関数をwhileループで呼び出すことで、関数の実行速度を測定しています。問題は何らかの理由でwhileループが長く実行されると経過時間が短くなることです。誰でも説明できますか?以下のコード。Java System.nanoTimeの経過平均時間が短くなっています

DescriptiveStatistics stats = new DescriptiveStatistics(); 
while(true) { 
    long startTime = System.nanoTime(); 
    executeSaxonXsltTransformation(); 
    long stopTime = System.nanoTime(); 
    long elapsedTime = stopTime-startTime; 
    stats.addValue((double)elapsedTime); 
    System.out.println(stats.getN()+" - "+elapsedTime+ " - "+stats.getMean()); 
} 

約1,000回の実行後、経過時間は750k~850kです。しかし、約100,000回実行した後、経過時間は580〜750kに低下します。継続的な減少は、平均(stats.getMeans())を見ることによって最もよく認識されます。これは、108kループの平均値が〜632kで、3kループの平均値は〜1millionです。 nanoTimeではなくcurrentTimeMillisに切り替えても何も変わりません。

答えて

4

JavaのJITは広範囲に実行されるコードを最適化するので、これはまったく起こりそうです。実行するほどJITが最適化するための努力が増えます。

ベンチマークを実行しようとしている場合は、タイミングなしで数秒間方法を実行してベンチマークを「ウォームアップ」し、タイミングを開始する必要があります。あるいは、Javaで一貫したベンチマークを行う方法を知っているライブラリを使用して、JITのウォームアップ、メソッドがナノ秒か秒かを問わず正確な測定結果を得ることができます(Caliperなど)。

+0

ありがとうございました。私はこれが起こっているような気がしました。 – Thirlan

+0

最近、Caliperは一貫したベンチマークを行う方法を知っていますか?私が最後に見たとき、PrintCompilationからの出力は非常に少なくても励まされませんでした。 – kittylyst

+0

キャリパーはマイクロベンチマーキングに非常に優れています。私は "マクロ"ベンチマークでどのように動作するのか分からないが、小さくてタイトな方法を測定するためには優れていると認めている。 –

7

問題は何らかの理由で、whileループが実行される時間が長くなるほど経過時間が短くなるという問題です。誰でも説明できますか?

これはホットスポットです。コードを実行するほど、より積極的に最適化されます。最終的には可能な限りの作業を完了し、結果に高原が表示されます。

+0

この質問をクリックする前から、私は自分自身に言った、 "私はOPが10k回の反復でジャンプを見ていると思う。これはサーバーモードでのコンパイルのデフォルトのしきい値です。 [動的コンパイル](http://www.ibm.com/developerworks/library/j-jtp12214/)のこのページも参照してください。 – yshavit

関連する問題