精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

20行經典C代碼,很多人看不明白,你來試一下?

開發 前端
現代CPU為了提高指令執行的速度和吞吐率,提升系統性能,不僅一直致力于提升CPU的主頻,還實現了多種ILP(Instruction-Level Parallelism 指令級并行)技術,如超流水線、超標量、亂序執行、推測執行、分支預測等。

大家好,我是江南一散人。周末逛知乎時,無意間看到阿里云開發者官方賬號的一篇文章中,居然引用了我三年前在今日頭條寫的一篇文章。有些感概,看來還真的在互聯網上留下了點痕跡。

那篇文章,其實和那篇《改幾行代碼,for循環耗時從3.2秒降到0.3秒!真正看懂的都是牛人!》是相關的,算是前傳吧,所以在這里發一下,感興趣的小伙伴不妨圍觀下!

全文如下,僅作微調。

引言

昨天發了一段有趣的代碼,引來很多童鞋圍觀。很多童鞋表示不太明白,于是就有了本文,詳細解釋下這段代碼的來龍去脈。

代碼如下圖所示:

圖片圖片

如果你是第一次看到的話,不妨試一下,看你能得出正確答案嗎?

其實,這個題目還是源自大師之手,我只是做了少許修改。先來聊一下這段歷史淵源吧。

注:為了盡量解釋清楚,篇幅有點長,請耐心讀完,相信你會有收獲的!

歷史淵源

1983年11月,一位叫Tom Duff的大牛在編寫串口通信程序時,發現使用一般的寫法時,性能總是不能讓人滿意。后來,這位老兄憑借深厚的編程功底和精湛的C語言技藝,利用C語言中switch語句的一個鮮為人知的特性,發明如了下圖所示的經典代碼:

圖片圖片

結果,引來無數吃瓜群眾膜拜。在此之前,還沒有人發現并利用過C語言的這個特性,于是他便以自己的名字命名這段代碼,叫做Duff's Device,一般譯為"達夫設備"。

先看一下大牛的風采吧:

圖片圖片

下面講解一下這段代碼。

Duff's Device - 達夫設備

當時,Duff的需求,是把一段起始地址為from,長度為count的數據,寫入到一個內存映射的I/O(Memory Mapped I/O)寄存器to中。

最簡單的實現

需求很簡單,對吧?很容易想到直接用for或者while循環就可以解決了,如下圖所示:

圖片圖片

代碼清晰簡潔,很直觀,簡直完美,對吧?

Duff卻對此很不滿意,因為他覺得這種寫法雖然簡單,但太過低效,無法接受。

如此簡單的代碼,為何說它性能低下呢?主要有兩個問題:

? "無用"指令太多

? 無法充分發揮CPU的ILP(Instruction-Level Parallelism)技術

我們來分析一下。

無用指令太多

所謂無用指令,是指不直接對所期望的結果產生影響的指令。

對于這段代碼,我們期望的結果就是把數據都拷貝到I/O寄存器to中。那么,對于這個期望的結果來說,真正有用的代碼,其實只有中間那一行賦值操作:

*to = *from++;

而每次迭代過程中的while (--count > 0)產生的指令,以及每次迭代結束后的跳轉指令,對結果來說都是無用指令。

上面最簡單的實現中,每次循環迭代只拷貝一個字節數據。這就意味著,有多少個字節的數據,就需要執行多少次跳轉和條件判斷,以及--count的操作。

我們看一下匯編代碼:

圖片圖片

有些童鞋對匯編不太熟悉,我簡單講解一下:

? x64上優先使用寄存器傳遞,對于send()函數,第一個參數to存放在寄存器rdi中,第二個參數from存放在rsi中,第三個參數count存放在寄存器edx中。

? 第2~7行,把三個參數分別壓入棧中;

? 第9~14行,對應C語言的*to = *from++;

? 第15~19行,對應C語言的while (--count > 0);

? 最后幾句,恢復棧幀并返回

所以,第9-19行屬于熱點路徑,也就是主循環體。第9-14行屬于有效指令,第15-19行對于期望的數據結果來說就是無用指令。

我們看到,熱點路徑中,無用指令數占了整個熱點路徑指令數的一半,其開銷也占到整個函數的50%!

無法充分發揮ILP技術優勢

現代CPU為了提高指令執行的速度和吞吐率,提升系統性能,不僅一直致力于提升CPU的主頻,還實現了多種ILP(Instruction-Level Parallelism 指令級并行)技術,如超流水線、超標量、亂序執行、推測執行、分支預測等。

一個設計合理的程序,往往能夠充分利用CPU的這些ILP機制,以使性能達到最優。

但是,在代碼熱點路徑上,無用指令太多,且每個迭代只執行一條*to = *from++,無法充分發揮ILP的技術優勢。

注:這里解釋不夠清楚,詳細講解請參看文末推薦閱讀的兩篇文章,詳細介紹了ILP技術(如超流水線、超標量、推測執行、分支預測)。

現在,知道上面那個簡單實現性能差的原因了,那么如何去優化它呢?

循環展開

所謂循環展開,是通過增加每次迭代內數據操作的次數,來減小迭代次數,甚至徹底消除循環迭代的一種優化手段。

循環展開,有以下優點:

? 有效減少循環控制指令。前面說過,這些指令,是對結果不產生影響的無用指令。減少這些指令,就可以減少這些指令本身執行所需的開銷,從而提升整體性能。

? 通過合理的展開,可以更加有效地利用指令級并行ILP(Instruction-Level Parallelism 指令級并行)技術。

循環展開是一個很常用的性能優化手段,所有現代編譯器,通過合適的選項,都支持循環展開優化。

注:關于循環展開的詳細講解,請參看文末推薦閱讀的兩篇文章(如果你還沒看過的話)。

有童鞋可能會好奇,循環展開到底能提升多少性能呢?我們還是用數據說話,看一個實例吧。

實例 - 循環展開對性能的影響

測試環境:

OS:Ubuntu 19.04(Linux Kernel 5.0.0)
CPU:Intel(R) Xeon(R) Gold 6130
主頻:2.10GHz
Cache 大小:22MB
Cache line 大小:64 Bytes

測試代碼:

圖片圖片

loop1.c和loop2.c做的事情一樣,唯一的區別是:

? loop1.c每次循環迭代執行一次k++

  • ? loop2.c每次循環執行8次k++,但是循環的次數比loop1.c少了8倍

編譯:

gcc loop1.c -o loop1
gcc loop2.c -o loop2

測試結果:

圖片圖片

做同樣的事情,通過循環展開優化,所消耗時間直接從25.4秒降到了14.7秒!

第一次優化嘗試

了解了循環展開對性能提升的好處之后,我們就可以對上面的簡單實現進行第一次優化嘗試了。

我們先嘗試把每次循環內拷貝字節的個數,由1個提高到到8個,這樣就可以把迭代次數降低8倍。

我們先假設,send()函數的參數count總是8的倍數,那么上面的代碼就可以修改為:

圖片圖片

上面的代碼很好理解,就是把原來迭代里的操作復制了8次,然后把迭代次數降低到了8倍。

但是,我們前面做了一個假設,就是count是8的倍數。那如果不是8的整數倍呢,比如20?那我們可能會想到這樣的實現:

圖片圖片

其實,到了這里,相比原始的實現來說,性能已經能提升了不少了。但是,Duff仍然不滿意,他看著第二個while循環非常不爽,盡管對整體性能已經沒有太大影響了。

也許這就是大牛異于常人之處,大牛總是追求極致,總是可以在看似不可能的時候,再往前走一步。

C語言switch-case的一些特性

Duff注意到C語言中switch-case語句的一些特性:

? case語句后面的break語句不是必須的。

? 在switch語句內,case標號可以出現在任意的子語句之前,甚至運行出現在if、for、while等語句內。

于是,Duff便利用switch-case的特性,用來處理第一個while循環之后仍然剩余的count % 8個字節的數據。于是便有了這樣的代碼:

圖片圖片

解釋下這段代碼:

我們假設count = 20,那么:

n = (count + 7) / 8 = 27 / 8 = 3
count % 8 = 4

所以:

  1. 1. switch語句會落入case 4的標簽內,然后依次執行了case 4、3、2、1四條語句。自此之后,其實就跟switch-case語句再也沒有關系了。
  2. 2. while語句判斷--n > 0,條件成立,于是跳轉到case 0進入循環體執行,于是依次執行case 0、7、6、5、4、3、2、1一共8條語句。此時n = 2.
  3. 3. 再次進入while語句處判斷--n >0,條件成立,再次跳轉到case 0處進入循環體執行。此時n = 1。
  4. 4. 此時,while語句處判斷--n >0,條件失敗,退出循環,函數結束。

好了,到這里,大家應該理解Duff's Device了吧?還是不清楚的話,可以嘗試單步跟蹤一下,就會很清晰了。

揭曉答案

理解了Duff's Device之后,文章開頭的那個題目就很好理解了,現在揭曉答案:

再看一下源碼:

圖片圖片

編譯運行:

圖片圖片

所以,答案是:20

責任編輯:武曉燕 來源: 原點技術
相關推薦

2025-03-25 08:50:00

2025-09-15 00:00:01

2025-03-24 00:00:15

2015-12-23 11:32:50

2024-09-12 08:32:42

2021-01-30 11:42:53

迭代器代碼元素

2018-05-14 17:36:59

2018-05-14 11:31:02

2022-12-03 18:24:13

數據能力場景

2021-12-17 07:30:42

排序算法效率

2020-11-16 11:24:00

Spring AOP數據庫

2025-02-21 08:48:16

Typescript內置聯合類型

2022-11-25 07:59:43

JavaIOGuava

2009-04-23 08:31:23

微軟鮑爾默收購

2025-06-13 10:14:55

2018-02-13 14:48:17

戴爾

2022-02-06 00:07:19

互聯網失業職業

2021-06-16 10:03:54

代碼開發工具

2021-07-26 05:17:39

Linux PosixLinux 系統

2010-12-06 09:10:02

LightSwitch
點贊
收藏

51CTO技術棧公眾號

亚洲欧美另类日本| 成人免费毛片嘿嘿连载视频…| 日韩五码电影| 有坂深雪av一区二区精品| 91|九色|视频| 影音先锋在线国产| 99久久这里只有精品| 精品剧情v国产在线观看在线| 欧美 国产 日本| 免费网站免费进入在线| caoporen国产精品视频| 国产精品va在线| 久久国产在线观看| 日韩在线欧美| 日韩电影在线观看中文字幕 | 第九区2中文字幕| 精品久久久无码中文字幕| 亚洲综合电影一区二区三区| 久热爱精品视频线路一| 日本少妇高潮喷水xxxxxxx| 日韩精品一区二区三区免费视频| 精品久久久久久久大神国产| 在线观看亚洲视频啊啊啊啊| 青青草视频在线免费观看| 国精产品一区一区三区mba视频| 97欧美精品一区二区三区| 日本裸体美女视频| 亚洲天堂日韩在线| 精品国产一区二区在线观看| 美女在线视频一区二区| 波多野结衣久久精品| 亚洲综合色噜噜狠狠| 一本一本a久久| 久久久资源网| 91在线观看高清| www日韩av| 国产又黄又大又爽| 视频一区二区欧美| 国模视频一区二区三区| 国产大学生自拍| 天天av综合| 在线成人一区二区| 自拍偷拍中文字幕| 欧美成人午夜77777| 欧美一区二区久久| 中文字幕第66页| 999精品视频在线观看| 欧美日韩一区二区三区高清| 日韩网址在线观看| 色一区二区三区| 精品毛片网大全| 激情伊人五月天| 888av在线视频| 亚洲国产精品精华液网站| 日韩一级特黄毛片| 中文字幕在线播放网址| 亚洲蜜桃精久久久久久久| 亚洲第一页在线视频| 日本不卡在线| 最新国产の精品合集bt伙计| 伊人久久大香线蕉av一区| 婷婷在线视频| 亚洲男人天堂一区| 国产成人一二三区| 久草在线视频网站| 懂色av一区二区三区| 僵尸世界大战2 在线播放| 丰满大乳少妇在线观看网站 | 日韩欧美久久久| 国产乱子伦农村叉叉叉| av今日在线| 婷婷六月综合亚洲| 黄色免费福利视频| 精品3atv在线视频| 欧美性受xxxx黑人xyx性爽| 九热视频在线观看| 亚洲伦理网站| 精品奇米国产一区二区三区| 制服丝袜第一页在线观看| 一道本一区二区三区| 原创国产精品91| 国产午夜手机精彩视频| 黄色日韩在线| 国产成人精品午夜| 在线中文字幕网站| 国产精品1024| 久久偷看各类wc女厕嘘嘘偷窃 | 久久亚洲捆绑美女| 亚洲激情一区二区三区| av片在线观看| 精品国产户外野外| 免费看国产黄色片| 日韩中文字幕视频网| 日韩av在线免播放器| 亚洲自拍偷拍图| 你懂的视频一区二区| 国产69精品久久久久久| 这里只有精品6| 成人美女视频在线观看18| 青青草国产精品| caoporn免费在线| 8888四色奇米在线观看| av中文字幕在线不卡| 亚洲ai欧洲av| 国产精品vvv| 欧美久久一二区| 在线天堂www在线国语对白| 欧美限制电影| 97国产精品视频人人做人人爱| 无码人妻精品一区二区三区蜜桃91| 国产在线视频一区二区三区| 久久精品日韩精品| av大片在线| 91福利区一区二区三区| 香蕉久久久久久av成人| 成人情趣视频网站| 欧美一级大片视频| av在线亚洲天堂| 亚洲国产精品国自产拍av| 亚洲理论电影在线观看| 日韩第二十一页| 亚洲欧美日韩精品久久亚洲区 | 高清国产一区| 在线观看麻豆蜜桃| 欧美午夜影院在线视频| 国产免费a级片| 国产精品精品| 国产精品视频播放| 邻家有女韩剧在线观看国语| 亚洲第一主播视频| 97超碰免费在线观看| 日韩欧美一区免费| 国产精品91在线| 全部免费毛片在线播放一个| 亚洲精品ww久久久久久p站| 视色视频在线观看| 少妇精品久久久一区二区| 亚州精品天堂中文字幕| 亚洲精品国产精品国| 亚洲免费在线看| 亚洲第一天堂久久| 国产精品久久天天影视| 国产日本欧美在线观看| 成年人视频免费在线观看| 日韩欧美国产视频| 日本一区二区三区网站| 欧美欧美天天天天操| 91香蕉亚洲精品| 操你啦在线视频| 欧美一区二区三区视频在线观看| 久久一级免费视频| 捆绑紧缚一区二区三区视频 | 韩日精品在线| 99国产超薄丝袜足j在线观看 | 亚洲女子a中天字幕| 日日干日日操日日射| 色777狠狠狠综合伊人| 国产精品久久久久福利| lutube成人福利在线观看| 91福利国产成人精品照片| 波多野结衣a v在线| 天堂成人免费av电影一区| 国产乱人伦精品一区二区| 97在线超碰| 日韩精品在线观| 在线免费观看av网址| 欧美国产欧美亚州国产日韩mv天天看完整| 蜜臀久久99精品久久久酒店新书| 国产精品嫩草影院在线看| 国产精品va在线播放| 浮生影视网在线观看免费| 欧美调教femdomvk| 日本成人免费在线观看| 极品少妇一区二区三区精品视频| 强开小嫩苞一区二区三区网站| 精品中文在线| 97视频免费在线观看| 男同在线观看| 欧美人伦禁忌dvd放荡欲情| 少妇被躁爽到高潮无码文| 福利电影一区二区三区| 日本成年人网址| 日韩中文字幕高清在线观看| 91丝袜脚交足在线播放| 高清毛片在线观看| 在线精品国产成人综合| 国产日韩欧美视频在线观看| 亚洲最大的成人av| 欧美熟妇一区二区| 久久99久久久欧美国产| 欧美精品久久久久久久久久久| 免费欧美一区| 91老司机在线| 国产精品69xx| 亚洲日本成人网| av无码精品一区二区三区宅噜噜| 婷婷久久综合九色综合伊人色| 欧美巨胸大乳hitomi| 丁香啪啪综合成人亚洲小说 | 成人久久久精品乱码一区二区三区| 91黄色小网站| 91精品秘密在线观看| 欧美不卡三区| 久久99成人| 国产精品久久国产精品99gif| 欧美videos另类精品| 亚洲欧美综合v| 亚洲av色香蕉一区二区三区| 在线观看免费一区| 日本在线视频免费| 亚洲欧洲国产日本综合| 青青草成人免费视频| 国产一区二区在线视频| 免费激情视频在线观看| 一区在线视频观看| 中国老女人av| 日韩大片在线| 欧美成人蜜桃| 九色丨蝌蚪丨成人| 亚洲最大福利网| 日韩城人网站| 国产精品揄拍一区二区| 在线播放高清视频www| 久久91精品国产91久久跳| 777电影在线观看| 亚洲精选在线观看| 日本精品久久久久久| 欧美sm极限捆绑bd| 97在线公开视频| 欧美区一区二区三区| 中文字幕日本视频| 91九色最新地址| 毛片毛片女人毛片毛片| 午夜精品福利一区二区蜜股av | 日韩欧美在线字幕| 日韩三级视频在线| 亚洲成va人在线观看| 久久免费精彩视频| 一区二区三区91| 538精品在线视频| 亚洲免费成人av| 青娱乐国产精品| 亚洲精品成人少妇| 日韩成人毛片视频| 亚洲男同1069视频| 2021亚洲天堂| 亚洲蜜臀av乱码久久精品蜜桃| 日韩福利小视频| 18欧美亚洲精品| 婷婷社区五月天| 亚洲日本中文字幕区| 婷婷久久综合网| 亚洲免费观看在线视频| 97成人资源站| 亚洲最新在线观看| 日韩人妻无码一区二区三区99| 性久久久久久久| 天堂中文在线网| 在线看不卡av| 亚洲综合免费视频| 91精品国产色综合久久ai换脸| 国产人妻精品一区二区三区| 日韩欧美成人激情| 人妻中文字幕一区| 亚洲欧美国产视频| 18免费在线视频| 成人444kkkk在线观看| 亚洲性图自拍| 2023亚洲男人天堂| 韩国精品主播一区二区在线观看| 国产精品美女主播| 久久99成人| 久久99国产精品| 国产一区二区三区网| 一本久道久久综合| 国产精品v亚洲精品v日韩精品| 97在线国产视频| 亚洲综合好骚| 亚洲国产日韩欧美在线观看| 国内成+人亚洲+欧美+综合在线| 国产精品二区视频| 韩国女主播成人在线观看| 精品国产91乱码一区二区三区| 无码人妻aⅴ一区二区三区69岛| 日本一区二区视频在线| www深夜成人a√在线| 亚洲五码中文字幕| 西西44rtwww国产精品| 欧美性色黄大片| 国内老熟妇对白hdxxxx| 亚洲精品福利在线观看| 91.xxx.高清在线| 久久久亚洲影院你懂的| 日本成人三级电影| 91欧美激情另类亚洲| 欧美一区 二区| 影音先锋欧美资源| 精品动漫3d一区二区三区免费| www.日本xxxx| 成人黄色一级视频| 久久视频一区二区三区| 亚洲国产乱码最新视频 | 91 在线视频| av午夜一区麻豆| 五月天精品在线| 亚洲午夜久久久久久久久电影院| av一级在线观看| 欧美一区二区播放| 九色在线播放| 久久久久久久999| 国产精品久久乐| 国内一区二区三区在线视频| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 91小视频免费看| 精品国产视频一区二区三区| 亚洲一本大道在线| 国产又粗又长视频| 亚洲精品视频在线观看视频| 色图在线观看| 国产日韩专区在线| 精品国产99| 日本精品一区二区三区四区| 国产suv精品一区二区883| 男人天堂资源网| 色哟哟精品一区| 人妻视频一区二区三区| 欧美成人小视频| 日韩三级一区| 亚洲一区3d动漫同人无遮挡| 久久一区二区三区超碰国产精品| 一边摸一边做爽的视频17国产| 亚洲欧美日韩一区二区 | 久久99精品国产| 大胸美女被爆操| 色狠狠一区二区| 美女欧美视频在线观看免费| 17婷婷久久www| 欧美三级午夜理伦三级小说| 青青青在线视频播放| 国产不卡一区视频| 麻豆精品一区二区三区视频| 4hu四虎永久在线影院成人| 最新97超碰在线| 国产精品视频xxxx| 日韩欧美字幕| 亚洲成人福利在线| 国产精品欧美极品| 在线免费av网| 久久精品国产69国产精品亚洲| 久久电影天堂| 中文字幕一区二区三区四区五区 | 日本网站在线免费观看视频| 国产精品视频区1| 久久看人人摘| 亚洲男人天堂2021| 一区二区三区不卡视频在线观看 | 天天操夜夜操视频| 亚洲人成免费电影| 精品欧美日韩精品| 亚洲一区二三| 国产呦萝稀缺另类资源| 欧美黄色免费看| 亚洲国产日韩精品在线| 伊人成综合网站| 午夜精品一区二区在线观看的| 美女视频黄免费的久久| 免费在线观看黄色小视频| 欧美一级免费大片| 17videosex性欧美| 欧美中文娱乐网| 九色|91porny| 久久久久久天堂| 亚洲男人天堂2024| 成人在线观看免费播放| 欧美 国产 精品| a美女胸又www黄视频久久| 黄色片视频免费| 久久精品国产99国产精品澳门| 91蜜桃臀久久一区二区| 免费在线激情视频| 国产精品麻豆久久久| www男人的天堂| 国产成人自拍视频在线观看| 希岛爱理av一区二区三区| 成年女人免费视频| 色噜噜狠狠色综合中国| 福利在线视频网站| 精品国产乱码久久久久久郑州公司| 肉丝袜脚交视频一区二区| 朝桐光av在线| 亚洲精品天天看| 国产精品一区二区三区四区在线观看| 国产中文字幕乱人伦在线观看| 国产午夜精品久久久久久久| 成人午夜一级二级三级| 亚洲精品影片| 黄色成人免费看| 亚洲一区二区五区| 在线视频91p| 精品久久久久久一区二区里番|