0

プログラミング言語の時刻に問題が発生したのはこれが初めてではありません。基本的に、whileループで関数を呼び出すことにより、関数の実行速度を測定しています。問題は、何らかの理由で、whileループの実行時間が長くなるほど経過時間が短くなり続けることです。誰か説明できますか?以下のコード。

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回の実行後、経過時間は580kから750kに低下します。継続的な減少は、平均(stats.getMeans())を見ると最もよくわかります。これは、108kループ後の平均が約632kであるのに対し、3kループの平均は約100万です。nanoTimeの代わりにcurrentTimeMillisに切り替えても、何も変わりません。

4

2 に答える 2

7

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

それはあなたにとってのホットスポットです-コードを実行すればするほど、コードはより積極的に最適化されます。最終的には、できる限りのことを実行し、結果にプラトーが見られます。

于 2012-03-15T17:27:37.010 に答える
4

JavaのJITは、広範囲に実行されるコードを最適化するため、これは完全に発生するはずです。実行するほど、JITはコードの最適化に多くの労力を費やします。

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

于 2012-03-15T17:27:18.817 に答える