likely和unlikely
likely與unlikely互換或不用都不會影響程式的正確性。但可能會影響程式的效率。
在閱讀linux核心程式碼時經常出現likely()和unlikely()兩個巨集函式,位於/include/linux/compiler.h中
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
這裡的__built_expect()函式是gcc(version >= 2.96)的內建函式,提供給程式設計師使用的,目的是將"分支轉移"的資訊提供給編譯器,這樣編譯器對程式碼進行優化,以減少指令跳轉帶來的效能下降。
在一條指令執行時,由於流水線的作用,CPU可以同時完成下一條指令的取指,這樣可以提高CPU的利用率。在執行條件分支指令時,CPU也會預取下一條執行,但是如果條件分支的結果為跳轉到了其他指令,那CPU預取的下一條指令就沒用了,這樣就降低了流水線的效率。因此跳轉指令相對於順序執行的指令會多消耗CPU時間,如果可以儘可能不執行跳轉,也可以提高CPU效能。
__buildin_expect((x), 1)表示x的值為真的可能性更大。
__buildin_expect((x), 0)表示x的值為假的可能性更大。
也就是說,使用likely(),執行if後面的語句的機會更大,使用unlikely(),執行else後面的語句機會更大一些。
相關推薦
詳解likely和unlikely函式【轉】
核心原始碼:linux-2.6.38.8.tar.bz2 在Linux核心中likely和unlikely函式有兩種(只能兩者選一)實現方式,它們的實現原理稍有不同,但作用是相同的,下面將結合linux-2.6.38.8版本的核心程式碼來進行講解。
linux核心中:likely和unlikely函式
核心原始碼:linux-2.6.38.8.tar.bz2 在Linux核心中likely和unlikely函式有兩種(只能兩者選一)實現方式,它們的實現原理稍有不同,但作用是相同的,下面將結合linux-2.6.38.8版本的核心程式碼來進行講解。
likely和unlikely
首先明確: likely與unlikely互換或不用都不會影響程式的正確性。但可能會影響程式的效率。 在閱讀linux核心程式碼時經常出現likely()和unlikely()兩個巨集函式,位於/include/linux/compiler.h中 #define likely(x) _
核心中的likely和unlikely巨集的使用
在核心程式碼中經常會看到unlikely和likely的蹤影。他們實際上是定義在 linux/compiler.h 中的兩個巨集。 #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __
Likely和unlikely 分析
以前我有兩個同事寫過關於likely()和unlikely()兩個巨集函式的文件,但是我覺得每個人寫的都有自己更為清晰的地方,所以,將二者組合,以及參考網上http://blog.sina.com.cn/s/blog_70dd16910100w018.html得到以下內容
likely和unlikely的區別
咱們不用對likely和unlikely感到迷惑,須要知曉的就是 if(likely(a>b)) 和 if(a>b)在功能上是等價的,同樣 if(unlikely(a<b)) 和 if(a<b) 的功能也是一樣的。不一樣的只是他們聲稱的二進位制程式碼有所不一樣,這一點咱們也可以從他
linux中likely()和unlikely()巨集
The gcc C compiler has a built-in directive that optimizes conditional branches as either very likely taken or very unlikely taken. The
linux核心中likely和unlikely的含義
在核心程式碼中經常會看到unlikely和likely的蹤影。他們實際上是定義在 linux/compiler.h 中的兩個巨集。 #define likely(x) __builtin_ex
有關likely和unlikely(轉)
紅色部分,原帖中沒有。在linux中判斷語句經常會看到likely和unlikely,例如:if(likely(value)){}else{}簡單從表面上看if(likely(value)) == if(value),if(unlikely(value)) == if(val
linux中的likely和unlikely
文章來源:http://blog.csdn.net/tommy_wxie/article/details/7384641 看核心時總遇到if(likely( )){}或是if(unlikely( ))這樣的語句,最初不解其意,現在有所瞭解,所以也想介紹一下。 likely() 與 unlikely()是核心(
【linux 開發】likely和unlikely用法及提升效率原理
1、具體定義如下,gcc 2.96以上版本支援 #define likely(x) __biltin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) 2、效率提升原理 #define likel
linux內核中宏likely和unlikely到底做了些什麽?
可能 3.3 png 通過 可能性 功能 clas 圖片 預測 1. 先看看它們長啥樣吧!(它們有兩種定義,第一種是使能了程序trace功能的宏定義,第二種是普通的宏定義,咱們分析普通宏定義吧) # define likely(x) __builtin_expect(
Linux 內核中 likely 與 unlikely 的宏定義解析
帶來 內核版本 sta don 等價 ddc 編譯 views lines 在 2.6 內核中,隨處能夠見到 likely() 和 unlikely() 的身影,那麽為什麽要用它們?它們之間有什麽差別? 首先要明白: if(likel
likely()與unlikely()函式的作用
#define likely(x) __builtin_expect(!!(x), 1) 也就是說明x==1是“經常發生的”或是“很可能發生的”。 所以使用likely ,執行if後面語句的可能性大些,編譯器將if{}是的內容編譯到前面 使用unlikely ,執行else後
likely()與unlikely()函式
likely() 與 unlikely()是核心中定義的兩個巨集 #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __
linux中 likely與unlikely
轉自 http://blog.csdn.net/tommy_wxie/article/details/7384641 看核心時總遇到if(likely( )){}或是if(unlikely( ))這樣的語句,最初不解其意,現在有所瞭解,所以也想介紹一下。 likely(
Linux 核心中 likely 與 unlikely 的巨集定義解析
在 2.6 核心中,隨處可以見到 likely() 和 unlikely() 的身影,那麼為什麼要用它們?它們之間有什麼區別? 首先要明確: if(likely(value)) 等價於 if(value) if(unlikely(
(轉載)核心中的 likely() 與 unlikely()
00000000 <testfun>: 0: 55 push %ebp 1: 89 e5 mov %esp,%ebp 3: 8b 45 08 mov
淺談likely與unlikely
在linux核心程式碼中隨處可見if語句中出現likely或unlikely,這兩個東西是幹什麼的呢? 偶然看到有人問這個問題,自己也整理一下~ likely或unlikely用於優化條件語句,其一般用法為: 條件判斷之後會有兩個出口,一個是真,一個是假。然而編譯生
學習筆記 --- LINUX核心裡面的likely與unlikely
看核心時總遇到if(likely( )){}或是if(unlikely( ))這樣的語句,最初不解其意,現在有所瞭解,所以也想介紹一下。 likely() 與 unlikely()是核心(我看的是2.6.22.6版本,2.6的版本應該都有)中定義的兩個巨集。位於/in