1. 程式人生 > >likely和unlikely

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後面的語句機會更大一些。

相關推薦

詳解likelyunlikely函式【轉】

 核心原始碼:linux-2.6.38.8.tar.bz2      在Linux核心中likely和unlikely函式有兩種(只能兩者選一)實現方式,它們的實現原理稍有不同,但作用是相同的,下面將結合linux-2.6.38.8版本的核心程式碼來進行講解。

linux核心中:likelyunlikely函式

  核心原始碼:linux-2.6.38.8.tar.bz2      在Linux核心中likely和unlikely函式有兩種(只能兩者選一)實現方式,它們的實現原理稍有不同,但作用是相同的,下面將結合linux-2.6.38.8版本的核心程式碼來進行講解。    

likelyunlikely

首先明確:        likely與unlikely互換或不用都不會影響程式的正確性。但可能會影響程式的效率。 在閱讀linux核心程式碼時經常出現likely()和unlikely()兩個巨集函式,位於/include/linux/compiler.h中   #define likely(x)    _

核心中的likelyunlikely巨集的使用

在核心程式碼中經常會看到unlikely和likely的蹤影。他們實際上是定義在 linux/compiler.h 中的兩個巨集。   #define likely(x) __builtin_expect(!!(x), 1)   #define unlikely(x) __

Likelyunlikely 分析

以前我有兩個同事寫過關於likely()和unlikely()兩個巨集函式的文件,但是我覺得每個人寫的都有自己更為清晰的地方,所以,將二者組合,以及參考網上http://blog.sina.com.cn/s/blog_70dd16910100w018.html得到以下內容

likelyunlikely的區別

  咱們不用對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核心中likelyunlikely的含義

在核心程式碼中經常會看到unlikely和likely的蹤影。他們實際上是定義在 linux/compiler.h 中的兩個巨集。   #define likely(x)    __builtin_ex

有關likelyunlikely(轉)

紅色部分,原帖中沒有。在linux中判斷語句經常會看到likely和unlikely,例如:if(likely(value)){}else{}簡單從表面上看if(likely(value)) == if(value),if(unlikely(value)) == if(val

linux中的likelyunlikely

文章來源:http://blog.csdn.net/tommy_wxie/article/details/7384641 看核心時總遇到if(likely( )){}或是if(unlikely( ))這樣的語句,最初不解其意,現在有所瞭解,所以也想介紹一下。 likely() 與 unlikely()是核心(

【linux 開發】likelyunlikely用法及提升效率原理

1、具體定義如下,gcc 2.96以上版本支援 #define likely(x) __biltin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) 2、效率提升原理 #define likel

linux內核中宏likelyunlikely到底做了些什麽?

可能 3.3 png 通過 可能性 功能 clas 圖片 預測 1. 先看看它們長啥樣吧!(它們有兩種定義,第一種是使能了程序trace功能的宏定義,第二種是普通的宏定義,咱們分析普通宏定義吧) # define likely(x) __builtin_expect(

Linux 內核中 likelyunlikely 的宏定義解析

帶來 內核版本 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中 likelyunlikely

轉自  http://blog.csdn.net/tommy_wxie/article/details/7384641 看核心時總遇到if(likely( )){}或是if(unlikely( ))這樣的語句,最初不解其意,現在有所瞭解,所以也想介紹一下。 likely(

Linux 核心中 likelyunlikely 的巨集定義解析

在 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 

淺談likelyunlikely

在linux核心程式碼中隨處可見if語句中出現likely或unlikely,這兩個東西是幹什麼的呢? 偶然看到有人問這個問題,自己也整理一下~ likely或unlikely用於優化條件語句,其一般用法為: 條件判斷之後會有兩個出口,一個是真,一個是假。然而編譯生

學習筆記 --- LINUX核心裡面的likelyunlikely

看核心時總遇到if(likely( )){}或是if(unlikely( ))這樣的語句,最初不解其意,現在有所瞭解,所以也想介紹一下。 likely() 與 unlikely()是核心(我看的是2.6.22.6版本,2.6的版本應該都有)中定義的兩個巨集。位於/in