likely() 與 unlikely() 在 Linux kernel 中隨處可見(jiàn),那為什么要用它們?它們之間有什么區(qū)別呢?
首先明確:
if (likely(value)) 等價(jià)于 if (value)
if (unlikely(value)) 等價(jià)于 if (value)
也就是說(shuō) likely() 和 unlikely() 從閱讀和理解的角度是一樣的。
這兩個(gè)宏在內(nèi)核中定義如下:
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
這里的 __builtin_expect() 函數(shù)是 gcc(version >= 2.96) 的內(nèi)建函數(shù),提供給程序員使用的,目的是將"分支轉(zhuǎn)移"的信息提供給編譯器,這樣編譯器對(duì)代碼進(jìn)行優(yōu)化,以減少指令跳轉(zhuǎn)帶來(lái)的性能下降。
__builtin_expect(!!(x), 1)表示 x 的值為真的可能性更大.
__builtin_expect(!!(x), 0)表示 x 的值為假的可能性更大.
也就是說(shuō),使用 likely(),執(zhí)行 if 后面的語(yǔ)句的機(jī)會(huì)更大,使用 unlikely(),執(zhí)行 else 后面的語(yǔ)句機(jī)會(huì)更大一些。
通過(guò)這種方式,編譯器在編譯過(guò)程中,會(huì)將可能性更大的代碼緊跟著后面的代碼,從而減少指令跳轉(zhuǎn)帶來(lái)的性能上的下降。
這樣 cache 在預(yù)取數(shù)據(jù)時(shí)可以盡量取到真正要跑的數(shù)據(jù),增加了 cache 的命中率。
不用對(duì) likely 和 unlikely 感到迷惑,須要知曉的就是 if(likely(a>b)) 和 if(a>b) 在功能上是等價(jià)的。示例代碼:
#include xxx
#define unlikely(x) __builtin_exp ect(!!(x), 0)
#define likely(x) __builtin_exp ect(!!(x), 1)
int main()
{
int a=2,b=4;
if(unlikely(a<=b)){
printf("in the unlikely,is not your expecting!n");
} else {
printf("in the unlikely, is your exp ectingn");
}
if(likely(a<=b)){
printf("in the likely, is your exp ectingn");
}
return 0;
}
這樣的寫(xiě)法,編譯器在對(duì)代碼進(jìn)行優(yōu)化時(shí),就會(huì)知道第一個(gè) if 判斷后,很可能跑的是 else 語(yǔ)句,cpu 就會(huì)先對(duì) else 進(jìn)行取址。
總之,likely 和 unlikely 的功能就是增加 cache 的命中率,提高系統(tǒng)執(zhí)行速度。
-
Linux
+關(guān)注
關(guān)注
87文章
11329瀏覽量
209975 -
編譯器
+關(guān)注
關(guān)注
1文章
1640瀏覽量
49200
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論