簡體   English   中英

為什么分支預測比沒有分支更快?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM