淺談likely與unlikely
在linux核心程式碼中隨處可見if語句中出現likely或unlikely,這兩個東西是幹什麼的呢?
偶然看到有人問這個問題,自己也整理一下~
likely或unlikely用於優化條件語句,其一般用法為:
條件判斷之後會有兩個出口,一個是真,一個是假。然而編譯生成的目的碼是扁平的,其中一個出口必須通過跳轉來實現。
考慮下面一個場景:
1、判斷條件;
2、條件為真跳轉到4;
3、進行條件為假時的處理;
4、進行條件為真時的處理;
可見,如果條件為真,多了一次JMP操作,並且由於JMP打斷了處理器流水。
likely(x) 和 unlikely(x)的作用是用來編譯的,讓程式碼在多數情況下不會發生JMP的情況
比如,likely(x)就告訴編譯器,x在大多數情況下結果會是真,於是編譯器生成的結果為真的出口不需要JMP。unlikely(x)類似~
突然又想到一個問題,其實likely和unlikely應該只對單條件的if語句才有意義。如果是多個條件的複合,條件表示式值的計算本身就要通過JMP來選擇真假出口,所以用不用likely都影響不大。
相關推薦
淺談likely與unlikely
在linux核心程式碼中隨處可見if語句中出現likely或unlikely,這兩個東西是幹什麼的呢? 偶然看到有人問這個問題,自己也整理一下~ likely或unlikely用於優化條件語句,其一般用法為: 條件判斷之後會有兩個出口,一個是真,一個是假。然而編譯生
淺談angular2與angularJS的區別
iges style 區別 float 頁面加載速度 小夥伴 困境 特征 架構 簡介 大家好,今天給大家介紹一下angular,相信做過前端的小夥伴們都知道angular的大名,angularJS自2012年發布起就受到了大家的廣泛關註。他首次提出
淺談jdbcTemplate與mybatis
root true method per .get utf alibaba void tweene Spring對數據庫的操作在jdbc上面做了深層次的封裝,也就是工具類 jdbcTemplate 作用: 1: 它提供了AOP式的事務管理 AOP式的事物管理:在以前的事務管
C++ 淺談 strlen 與 sizeof的區別
數據 數組長度 eof out 其他 使用 c++ 區別 字符串數組 先舉個栗子: 字符串數組跟字符串指針,然後分別使用sizeof跟strlen看輸出結果。 char strA[] = "2017-7-19"; char *strB = "23333"; cout &
淺談群集與分布式基礎知識
負載均衡 分布式 高可用 群集 高性能 長期以來對於做IT的人員來說可能會經常聽見一個名詞,群集,什麽負載均衡群集,高可用群集,雙活群集,這對於非相關人員來說根本不明白是什麽意思,好像群集很神秘,很高大上,其實群集的概念並沒有想象中那麽復雜,本文老王會試著用比較簡單的語言,來為大家分享
Linux 內核中 likely 與 unlikely 的宏定義解析
帶來 內核版本 sta don 等價 ddc 編譯 views lines 在 2.6 內核中,隨處能夠見到 likely() 和 unlikely() 的身影,那麽為什麽要用它們?它們之間有什麽差別? 首先要明白: if(likel
淺談svg與canvas
clas 過度 重現 屬性 事件處理器 script 得到 分辨率 繪制 SVG SVG 是一種使用 XML 描述 2D 圖形的語言。 SVG 基於 XML,這意味著 SVG DOM 中的每個元素都是可用的。您可以為某個元素附加 JavaScript 事件處理器。 在 SV
淺談Git與SVN的使用感受
開發 -c 運用 svn的使用 我們 repo easy 這一 style 作為版本號控制工作。兩者的做大的差別應該在於:Git屬於分布式版本號控制工具,而SVN屬於
淺談JobExecutionContext與JobDataMap
def 就會 AC 分享 lca 環境 -m BE .text 1.JobExecutionContext簡介 (1)當Scheduler調用一個Job,就會將JobExecutionContext傳遞給job的execute方法 quartz無法調用job的有參構
淺談MVC與三層架構
級別 ace isp 數據訪問 velocity 映射 領域 mark gmv mvc: model(模型),view(視圖),controller(控制器) 三層架構:展現層(User Interface layer)、業務邏輯層(Business Logic
淺談集合與引用
習慣 能力 har 優點 報錯 dealloc cas 子查詢 表達 在談集合之前,需要先談談離散性的概念:所謂離散性,是指集合的成員可以遊離在集合之外存在並參與運算,遊離成員還可以再組成新的集合。從離散性的解釋上可以知道,離散性是針對集合而言的一種能力,離開集合概念單獨談
淺談HTTP與HTTPS
信用 都是 什麽 攻擊 網上 發送 數據 bsp 之間 超文本傳輸協議HTTP協議被用於在Web瀏覽器和網站服務器之間傳遞信息,HTTP協議以明文方式發送內容,不提供任何方式的數據加密,如果攻擊者截取了Web瀏覽器和網站服務器之間的傳輸報文,就可以直接讀懂其中的信息,因
【廣州網站建設公司】淺談外貿與國內網站設計的不同之處
所謂的外貿是什麼?就是主要針對外國客戶所做的一個網站,並且這個網站還要符合外國客戶的體驗習慣以及需要獲得外國搜尋引擎的抓爬和收錄,在能在網際網路上立足。而國內的網站建設又是怎樣的呢?不同之處又在那裡?下面來聽聽廣東鋒火網站建設公司怎麼說吧! 網站內容 要想取得
java 淺談get與post的區別
1.、get 是從伺服器上獲取資料,post 是向伺服器傳送資料。 get 請求返回 request - URI 所指出的任意資訊。 Post 請求用來發送電子郵件、新聞或傳送能由互動使用者填寫的表格。這是唯一需要在請求中傳送body的請求。使用Post請求時需要在報文首部 Content -
likely()與unlikely()函式的作用
#define likely(x) __builtin_expect(!!(x), 1) 也就是說明x==1是“經常發生的”或是“很可能發生的”。 所以使用likely ,執行if後面語句的可能性大些,編譯器將if{}是的內容編譯到前面 使用unlikely ,執行else後
淺談Redis與MySQL的耦合性以及利用管道完成MySQL到Redis的高效遷移
淺談Redis與MySQL的耦合性以及利用管道完成MySQL到Redis的高效遷移 ㈠ Redis 與 MySQL 的耦合性 在業務架構早期、我們便該"吃著碗裡的看著鍋裡的"、切莫讓MyS
淺談並行與併發
1、示例: 順序執行:你吃飯吃到一半,電話來了,你一直到吃完了以後才去接,這就說明你不支援併發也不支援並行。 併發:你吃飯吃到一半,電話來了,你停了下來接了電話,接完後繼續吃飯,這說明你支援併發。 並行:你吃飯吃到一半,電話來了,你一邊打電話一邊吃飯,這說明你支援並行。此處注意理解:是同時吃
淺談SQLServer與MySQL的區別
mysql的日期 1) 獲得當前日期函式:curdate(),current_date() 2) 獲得當前時間函式:curtime(); 3) 獲得當前日期+時間:now(); 4) MySQL dayof… 函式:dayofweek(), dayofmonth(), dayofyear()分別返回
淺談Comparable與Comparator的區別
package com.list.customsort; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.List; import ja
淺談equals() 與 hashcode()
專案閒暇,讀書所獲。 equals()是根類Object中的方法。原始碼如下: public boolean equals(Object obj) { return (th