この記事では、別の方法を提案しています。ただし、ループ条件を評価する必要はまだあります。Javaはこのケースを認識するために特定のトリックを採用しているだけですか?
5 に答える
引用した記事のフォローアップストーリーをチェックしてください。
回答者への注意: OP は、Java JIT ではなく .NET JIT について質問しているようです。参照されている記事では、Java が空のループを最適化するより良い仕事をした (または Java だけが行った) ことが示唆されているためです。
編集: より多くの回答をグーグルで検索すると、Jon Skeet の名前が次々と出てきます。たとえば、C# の最適化に関するこのスレッドを参照してください。したがって、彼が答えると、信頼できる答えが得られます! :-)
記事は2003年のものです。それ以来、CLI(およびJava VM)は大幅に進歩しています。一般に、マイクロベンチマークを実行するときは常に非常に注意する必要があります。jitのパフォーマンス、デッドコードを削除する際のコンパイラの効率、タイミングオーバーヘッド、ガベージコレクションなどを測定するのは非常に簡単です。
Java は常に空のループを最適化するとは限りません。この場合、4 つの BN 番号をカウントするのに 2.966 秒かかりました。
long start = System.nanoTime();
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++);
long time = System.nanoTime() - start;
System.out.printf("Took %.3f seconds to empty loop.%n", time * 1e-9);
版画
Took 2.966 seconds to empty loop.
これは Java 6u11 を使用していましたが、おそらく 6u14 の方がスマートです。
一般に、コードはできる限り単純に記述して、JVM が何をしようとしているのかを適切に推測できるようにします。