= 2.96) 的內建函數,提供給程序員使用的,目的是將"分支轉移"的信息提供給編譯器,這" />

91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

likely與unlikely在Linux kernel的區別

麥辣雞腿堡 ? 來源:嵌入式Linux系統開發 ? 作者:嵌入式Linux系統開 ? 2023-07-20 11:06 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

likely() 與 unlikely() 在 Linux kernel 中隨處可見,那為什么要用它們?它們之間有什么區別呢?

首先明確:

if (likely(value)) 等價于 if (value)
if (unlikely(value)) 等價于 if (value)

也就是說 likely() 和 unlikely() 從閱讀和理解的角度是一樣的。

這兩個宏在內核中定義如下:

#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)

這里的 __builtin_expect() 函數是 gcc(version >= 2.96) 的內建函數,提供給程序員使用的,目的是將"分支轉移"的信息提供給編譯器,這樣編譯器對代碼進行優化,以減少指令跳轉帶來的性能下降。

__builtin_expect(!!(x), 1)表示 x 的值為真的可能性更大.
__builtin_expect(!!(x), 0)表示 x 的值為假的可能性更大.

也就是說,使用 likely(),執行 if 后面的語句的機會更大,使用 unlikely(),執行 else 后面的語句機會更大一些。

通過這種方式,編譯器在編譯過程中,會將可能性更大的代碼緊跟著后面的代碼,從而減少指令跳轉帶來的性能上的下降。

這樣 cache 在預取數據時可以盡量取到真正要跑的數據,增加了 cache 的命中率。

不用對 likely 和 unlikely 感到迷惑,須要知曉的就是 if(likely(a>b)) 和 if(a>b) 在功能上是等價的。示例代碼:

#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;
}

這樣的寫法,編譯器在對代碼進行優化時,就會知道第一個 if 判斷后,很可能跑的是 else 語句,cpu 就會先對 else 進行取址。

總之,likely 和 unlikely 的功能就是增加 cache 的命中率,提高系統執行速度。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • Linux
    +關注

    關注

    87

    文章

    11509

    瀏覽量

    213685
  • 編譯器
    +關注

    關注

    1

    文章

    1661

    瀏覽量

    50197
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    Linux kernel內存管理模塊結構分析

    基于上面章節的需求,Linux kernel從虛擬內存(VM)、DMA mapping以及DMA buffer sharing三個角度,對內存進行管理.
    發表于 09-19 11:55 ?2214次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>kernel</b>內存管理模塊結構分析

    C語言中likelyunlikely的使用

    單片機/嵌入式編程中,對速度要求比較高,likelyunlikely就是一個比較好的技巧,適用于有if-else分支,且知道哪個發生概率大的情況。
    發表于 07-21 14:53 ?1458次閱讀

    說說android與linux有啥區別

    目錄區別與聯系嵌入式系統物聯網行業中的應用物聯網嵌入式系統的特征區別與聯系這個問題很多人問,尤其是初入嵌入式的菜鳥。其實大家都認為android是java,已經不是linux,殊不知
    發表于 11-04 07:53

    Linux Kernel核心中文手冊

    Linux Kernel核心中文手冊:Hardware Basic( 硬件基礎知識) 一個操作系統必須和作為它的基礎的硬件系統緊密配合。操作系統需要使用一些只有硬件才能提供的功能。為了完整的了解 Linux
    發表于 12-08 10:15 ?39次下載
    <b class='flag-5'>Linux</b> <b class='flag-5'>Kernel</b>核心中文手冊

    Developing Linux kernel space

    This thesis introduces how to develop kernel level device drivers on Linux platform in detail.
    發表于 08-21 10:22 ?10次下載

    linux內核kernel-api

    linux內核kernel-api,不知道從哪兒找的了,但是你如果想要做內核編程,這是一部api函數詳盡的工具書!!!五星推薦
    發表于 10-30 17:16 ?19次下載

    Linuxkernel_timer教程

    Linuxkernel_timer教程,很好的Linux自學資料,快來學習吧。
    發表于 04-15 17:59 ?12次下載

    Linux運行期間升級Linux系 統Uboot+kernel+Rootfs

    Linux運行期間升級Linux系 統Uboot+kernel+Rootfs
    發表于 10-30 08:43 ?5次下載
    <b class='flag-5'>在</b><b class='flag-5'>Linux</b>運行期間升級<b class='flag-5'>Linux</b>系 統Uboot+<b class='flag-5'>kernel</b>+Rootfs

    Linux-kernel-3 0的移植記錄

    Linux-kernel-3 0的移植記錄
    發表于 10-31 11:33 ?7次下載
    <b class='flag-5'>Linux-kernel</b>-3 0的移植記錄

    Linux Kernel 5.2.2震撼發布!

    首個維護版本更新之后,kernel.org官網上已經將Linux Kernel 5.2分支標記為“Stable”,意味著已經準備好大規模
    的頭像 發表于 08-09 17:01 ?3072次閱讀

    Linux Kernel 5.6-rc7候選版本發布

    新冠病毒爆發期間,Linus Torvalds 宣布了 Linux 5.6 的第七個每周候選版本,即 Linux Kernel 5.6-rc7 的發布。
    的頭像 發表于 03-26 15:52 ?5781次閱讀

    Linux_Kernel_Developments內核開發

    Linux_Kernel_Developments內核開發詳細說明。
    發表于 04-07 14:27 ?37次下載
    <b class='flag-5'>Linux_Kernel</b>_Developments內核開發

    Linux Kernel5.10維護周期將從2年延長至6年

    經過 Linux Kernel 社區成員的共同努力,Linux Kernel 5.10 維護周期最終確定從2年延長至6年。華為是第一個
    的頭像 發表于 05-24 13:52 ?2576次閱讀

    嵌入式linux系統和嵌入式android系統的區別和聯系

    目錄區別與聯系嵌入式系統物聯網行業中的應用物聯網嵌入式系統的特征區別與聯系這個問題很多人問,尤其是初入嵌入式的菜鳥。其實大家都認為android是java,已經不是linux,殊不知
    發表于 11-01 17:05 ?5次下載
    嵌入式<b class='flag-5'>linux</b>系統和嵌入式android系統的<b class='flag-5'>區別</b>和聯系

    Linux kernel的kretprobe機制和kprobe有何區別

    Linux kernel 的 kretprobe 機制和 kprobe 完全不同,本質原因在于,函數的入口地址是固定的,但函數的返回地址不固定,由于返回位置不固定,無法固定函數大小,無法事先插樁。
    的頭像 發表于 08-07 09:15 ?1500次閱讀
    <b class='flag-5'>Linux</b> <b class='flag-5'>kernel</b>的kretprobe機制和kprobe有何<b class='flag-5'>區別</b>?
    主站蜘蛛池模板: 男人资源站 | 国产精品影视 | 久久国产香蕉一区精品 | 色婷婷成人网 | 午夜精品区 | 免费能直接在线观看黄的视频 | 日日操夜夜操免费视频 | 免费又爽又黄禁片视频在线播放 | 国产婷婷色一区二区三区深爱网 | 快乐你懂的在线视频免费观看 | 国产精品美女一级在线观看 | 狂野欧美性猛交xxxx免费 | 色宅男午夜电影在线观看 | 99久精品 | 免费人成年激情视频在线观看 | 综合五月 | 永久免费的啪啪免费的网址 | 3p性小说 | 日本免费色网站 | 四虎永久在线精品国产免费 | 国产或人精品日本亚洲77美色 | 免费一级毛片女人图片 | 一级做a爰片久久毛片美女图片 | 美女张开腿露尿口给男人亲 | 色播影院性播免费看 | 又黄又湿又爽吸乳视频 | 福利盒子手机看片 | jiucao视频在线观看 | 伊人一区二区三区 | 亚洲综合免费 | 777kkk亚洲综合欧美色老头 | 在线观看黄色的网站 | 非常黄的网站 | 欧洲色 | 伊人网站在线观看 | 国产黄色小视频网站 | 激情狠狠干 | 久久综合九色综合97_ 久久久 | 中文字幕一区二区三区5566 | 夜夜操网 | 亚洲天堂婷婷 |