我測試的分支預測,這樣的代碼:爲什麼JVM不執行代碼?
//first loop
int sortedSum = 0;
long sortedStartTime = System.nanoTime();
for (int i = 0; i < sortedArray.length; i++) {
if (sortedArray[i] < 0) {
sortedSum += sortedArray[i];
}
}
long sortedTime = System.nanoTime() - sortedStartTime;
//second loop
int randomSum = 0;
long randomStartTime = System.nanoTime();
for (int i = 0; i < randomArray.length; i++) {
if (randomArray[i] < 0) {
randomSum += randomArray[i];
}
}
long randomTime = System.nanoTime() - randomStartTime;
System.out.println("random time: " + randomTime);
System.out.println("sorted time: " + sortedTime);
很簡單打印有關每個for循環的時間。
請注意,sortedSum
和randomSum
在循環中分配但從未被訪問。
這裏我們不談論分支預測,而是輸出結果。 的輸出是:
random time: 32
sorted time: 1595942
然後,我把第二個for循環的第一(第一randomArray環路,第二sortedArray)之前。 輸出是:
random time: 1541919
sorted time: 40
看來JVM不執行第二循環。我反編譯類文件,反編譯器不會擦除任何東西。
爲什麼?爲什麼JVM執行第一個循環?
P.S. 環境是:
Ubuntu 12.04 LTS
java version "1.7.0_11"
Java(TM) SE Runtime Environment (build 1.7.0_11-b21)
Java HotSpot(TM) 64-Bit Server VM (build 23.6-b04, mixed mode)
在您的第一個循環中,JVM正在升溫。在測量另外兩個之前,先製作第三個循環來預熱JVM。 – Ingo
http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro-benchmark-in-java – kiheru
由於JVM實際上正在執行兩個循環,所以問題主題是錯誤的。這是時間問題。 –