linux編譯相關likely與unlikely

原文鏈接:https://www.jianshu.com/p/2684613a300f

define likely(x) __builtin_expect(!!(x), 1)

define unlikely(x) __builtin_expect(!!(x), 0)

__builtin_expect((x),1)表示 x 的值爲真的可能性更大;
__builtin_expect((x),0)表示 x 的值爲假的可能性更大。
也就是說,使用likely(),執行 if 後面的語句的機會更大,使用 unlikely(),執行 else 後面的語句的機會更大。通過這種方式,編譯器在編譯過程中,會將可能性更大的代碼緊跟着起面的代碼,從而減少指令跳轉帶來的性能上的下降。
likely(x) 類似於if(x)
unlikely(x) 類似於if(x)
例如:
int x, y;
if(unlikely(x > 0))
y = 1;
else
y = -1;

上面的代碼中 gcc 編譯的指令會預先讀取 y = -1 這條指令,這適合 x 的值大於 0 的概率比較小的情況。如果 x 的值在大部分情況下是大於 0 的,就應該用 likely(x > 0),這樣編譯出的指令是預先讀取 y = 1 這條指令了。這樣系統在運行時就會減少重新取指了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章