![](/img/trans.png)
[英]Why are local variable length for-loops faster? Doesn't branch prediction reduce the effect of lookup times?
[英]Why is branch prediction faster than no branch at all?
靈感來自這個問題: 為什么處理排序數組比處理未排序數組更快?
我寫了自己的分支預測實驗:
public class BranchPrediction {
public static void main(final String[] args) {
long start;
long sum = 0;
/* No branch */
start = System.nanoTime();
sum = 0;
for (long i = 0; i < 10000000000L; ++i)
sum += i;
System.out.println(System.nanoTime() - start);
System.out.println(sum);
/* With branch */
start = System.nanoTime();
sum = 0;
for (long i = 0; i < 10000000000L; ++i)
if (i >= 0)
sum += i;
System.out.println(System.nanoTime() - start);
System.out.println(sum);
/* No branch (again) */
start = System.nanoTime();
sum = 0;
for (long i = 0; i < 10000000000L; ++i)
sum += i;
System.out.println(System.nanoTime() - start);
System.out.println(sum);
/* With branch (again) */
start = System.nanoTime();
sum = 0;
for (long i = 0; i < 10000000000L; ++i)
if (i >= 0)
sum += i;
System.out.println(System.nanoTime() - start);
System.out.println(sum);
}
}
結果讓我感到困惑:根據程序輸出,帶分支的循環比沒有分支循環的循環可靠得快。
示例輸出:
7949691477
-5340232226128654848
6947699555
-5340232226128654848
7920972795
-5340232226128654848
7055459799
-5340232226128654848
為什么會這樣?
編輯:
在我的其他機器(英特爾服務器和工作站)上運行相同的實驗后,我可能會得出結論,我所經歷的這種現象特定於這款筆記本電腦CPU(英特爾i7 Q740M)。
==== 6個月后編輯====
看看這個: http : //eli.thegreenplace.net/2013/12/03/intel-i7-loop-performance-anomaly/
請記住,JVM在內部優化執行,並且PC內部有緩存可以加快計算速度。 由於您擁有如此強大的處理器(許多獨立的核心),因此並不奇怪。 另請注意,在Java代碼下運行的代碼映射到PC的機器代碼。 只需輸入盡可能優化的代碼,讓JVM擔心它。
編輯:機器和硬件,如大負載,它們運行效率更高。 特別是緩存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.