1. 程式人生 > >linux內核中宏likely和unlikely到底做了些什麽?

linux內核中宏likely和unlikely到底做了些什麽?

可能 3.3 png 通過 可能性 功能 clas 圖片 預測

1. 先看看它們長啥樣吧!(它們有兩種定義,第一種是使能了程序trace功能的宏定義,第二種是普通的宏定義,咱們分析普通宏定義吧)

# define likely(x) __builtin_expect(!!(x), 1)
# define unlikely(x) __builtin_expect(!!(x), 0)

2. 從宏中我們可以看到__builtin_expect,這是什麽?

  這是gcc內置的函數,用來進行分支預測

3. 總是聽大家說這樣做可以優化性能,但是怎麽做到的呢?

  3.1 arm處理器中一條指令的執行分為三個階段,取指,譯碼,執行;

  3.2 提一下流水線,流水線可以提高性能,那麽以三級流水線為例;

    

  3.3 加入流水線後,CPU在執行當前指令的時候,已經將接下來要執行指令的取指譯碼過程完成了,配下圖看看;

    技術分享圖片

  3.4 如果cpu通過判斷不執行接下來的指令,那麽必然要將已完成的取指譯碼丟掉,這必然會降低cpu的性能;

  3.5 因此如果判斷的結果出現的可能性很大,那麽cpu就能大大避免丟掉已完成的取指譯碼,這樣也就提高了cpu的性能。

4. 既然這個__builtin_expect是gcc內置的,那麽我們去gcc源碼中找一下它吧

linux內核中宏likely和unlikely到底做了些什麽?