linux核心中likely和unlikely的含義
阿新 • • 發佈:2019-02-05
在核心程式碼中經常會看到unlikely和likely的蹤影。他們實際上是定義在 linux/compiler.h 中的兩個巨集。
#define likely(x) __builtin_expect(!!(x), )
#define unlikely(x) __builtin_expect(!!(x), 0)
這裡的__built_expect()函式是gcc的內建函式。
至於為什麼要在核心程式碼中使用這兩個巨集,主要的目的是為了進行程式碼的優化,提高系統執行速度。
比如 :
if (likely(a>b)) {
fun();
}
if (unlikely(a
fun();
}
這裡就是程式設計師可以確定 a>b 在程式執行過程中出現的可能相比較大,因此使用了likely()告訴編譯器將fun()函式的二進位制程式碼緊跟在前面程式的後面,這樣就cache在預取資料時就可以將fun()函式的二進位制程式碼拿到cache中。這樣,也就增加了cache的命中率。
同樣的,unlikely()的作用就是告訴編譯器,a
我們不用對likely和unlikely感到迷惑,需要知道的就是 if(likely(a>b)) 和 if(a>b)在功能上是等價的,同樣 if(unlikely(a
比如下面的程式碼:
#include
#define unlikely(x) __builtin_expect(!!(x), 0)
#define likely(x) __builtin_expect(!!(x), )
int main()
{
int a=,b=;
if(unlikely(a
printf("in the unlikely,is not your expecting!\n");
} else {
printf("in the unlikely, is your expecting\n");
}
if(likely(a
printf("in the likely, is your expecting\n");
}
return 0;
}
執行結果:
in the unlikely,is not your expecting!
in the likely, is your expecting
總之,likely和unlikely的功能就是增加cache的命中率,提高系統執行速度。
<script>window._bd_share_config={"common":{"bdSnsKey":{},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"},"share":{}};with(document)0[(getElementsByTagName('head')[0]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)];</script>
閱讀(1076) | 評論(0) | 轉發(3) |
給主人留下些什麼吧!~~
評論熱議