青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

woaidongmao

文章均收錄自他人博客,但不喜標題前加-[轉貼],因其丑陋,見諒!~
隨筆 - 1469, 文章 - 0, 評論 - 661, 引用 - 0
數據加載中……

兩個最容易被人忽略的基本代碼優化技術

Dr. Dobb’s Blogger的Walter Bright曾寫了一篇博文《Overlooked Essentials For Optimizing Code》,為我們總結了兩個最容易被人忽略的基本代碼優化技術。酷殼個人網站版主陳皓對本文進行了翻譯,現轉載于此,供大家學習。全文如下:

我編寫程序至今有35年了,我做了很多關于程序執行速度方面優化的工(一個示例),我也看過其它人做的優化。我發現有兩個最基本的優化技術總是被人所忽略。

注意,這兩個技術并不是避免時機不成熟的優化。并不是把冒泡排序變成快速排序(算法優化)。也不是語言或是編譯器的優化。也不是把 i*4寫成i<<2 的優化。

這兩個技術是:

使用 一個profiler。

查看程序執行時的匯編碼。

使用這兩個技術的人將會成功地寫出運行快的代碼,不會使用這兩個技術的人則不行。下面讓我為你細細道來。

使用一個 Profiler

我們知道,程序運行時的90%的時間是用在了10%的代碼上。我發現這并不準確。一次又一次地,我發現,幾乎所有的程序會在1%的代碼上花了99%的運行時間。但是,是哪個1%?一個好的Profiler可以告訴你這個答案。就算我們需要使用100個小時在這1%的代碼上進行優化,也比使用100個小時在其它99%的代碼上優化產生的效益要高得多得多。

問題是什么?人們不用profiler?不是。我工作過的一個地方使用了一個華麗而奢侈的Profiler,但是自從購買這個Profiler后,它的包裝3年來還是那么的暫新。為什么人們不用?我真的不知道。有一次,我和我的同事去了一個負載過大的交易所,我同事堅持說他知道哪里是瓶頸,畢竟,他是一個很有經驗的專家。最終,我把我的Profiler在他的項目上運行了一下,我們發現那個瓶頸完全在一個意想不到的地方。

就像是賽車一樣。團隊是贏在傳感器和日志上,這些東西提供了所有的一切。你可以調整一下賽車手的褲子以讓其在比賽過程中更舒服,但是這不會讓你贏得比賽,也不會讓你更有競爭力。如果你不知道你的速度上不去是因為引擎、排氣裝置、空體動力學、輪胎氣壓,或是賽車手,那么你將無法獲勝。編程為什么會不同呢?只要沒有測量,你就永遠無法進步。

這個世界上有太多可以使用的Profiler了。隨便找一個你就可以看到你的函數的調用層次,調用的次數,以前每條代碼的時間分解表(甚至可以到匯編級)。我看過太多的程序員回避使用Profiler,而是把時間花在那些無用的,錯誤的方向上的“優化”,而被其競爭對手所羞辱。(譯者陳皓注:使用Profiler時,重點需要關注:1)花時間多的函數以優化其算法,2)調用次數巨多的函數——如果一個函數每秒被調用300K次,你只需要優化出0.001毫秒,那也是相當大的優化。這就是作者所謂的1%的代碼占用了99%的CPU時間)

查看匯編代碼

幾年前,我有一個同事,Mary Bailey,她在華盛頓大學教矯正代數(remedial algebra),有一次,她在黑板上寫下:

x + 3 = 5

然后問他的學生“求解x”,然后學生們不知道答案。于是她寫下:

__ + 3 = 5

然后,再問學生“填空”,所有的學生都可以回答了。未知數x就像是一個有魔法的字母讓大家都在想“x意味著代數,而我沒有學過代數,所以我就不知道這個怎么做”。

匯編程序就是編程世界的代數。如果某人問我“inline函數是否被編譯器展開了?”或是問我“如果我寫下i*4,編譯器會把其優化為左移位操作嗎?”。這個時候,我都會建議他們看看編譯器的匯編碼。這樣的回答是不是很粗暴和無用?通常,在我這樣回答了提問者后,提問都通常都會說,對不起,我不知道什么是匯編!甚至C++的專家都會這么回答。

匯編語言是最簡單的編程語言了(就算是和C++相比也是這樣的),如:

ADD ESI,x

就是(C風格的代碼)

ESI += x;

而:

CALL foo

則是:

foo();

細節因為CPU的種類而不同,但這就是其如何工作的。有時候,我們甚至都不需要細節,只需要看看匯編碼的長啥樣,然后和源代碼比一比,你就可以知道匯編代碼很多很多了。

那么,這又如何幫助代碼優化?舉個例子,我幾年前認識一個程序員認為他應該去發現一個新的更快的算法。他有一個benchmark來證明這個算法,并且其寫了一篇非常漂亮的文章關于他的這個算法。但是,有人看了一下其原來算法以及新算法的匯編,發現了他的改進版本的算法允許其編譯器把兩個除法操作變成了一個。這和算法真的沒有什么關系。我們知道除法操作是一個很昂貴的操作,并且在其算法中,這倆個除法操作還在一個內嵌循環中,所以,他的改進版的算法當然要快一些。但,只需要在原來的算法上做一點點小的改動——使用一個除法操作,那么其原來的算法將會和新的一樣快。而他的新發現什么也不是。

下一個例子,一個D用戶張貼了一個 benchmark 來顯示 dmd (Digital Mars D 編譯器)在整型算法上的很糟糕,而ldc (LLVM D 編譯器) 就好很多了。對于這樣的結果,其相當的有意見。我迅速地看了一下匯編,發現兩個編譯器編譯出來相當的一致,并沒有什么明顯的東西要對2:1這么大的不同而負責。但是我們看到有一個對long型整數的除法,這個除法調用了運行庫。而這個庫成為消耗時間的殺手,其它所有的加減法都沒有速度上的影響。出乎意料地,benchmark 和算法代碼生成一點關系也沒有,完全就是long型整數的除法的問題。這暴露了在dmd的運行庫中的long型除法的實現很差。修正后就可以提高速度。所以,這和編譯器沒有什么關系,但是如果不看匯編,你將無法發現這一切。

查看匯編代碼經常會給你一些意想不到的東西讓你知道為什么程序的性能是那樣。一些意想不到的函數調用,預料不到的自傲,以及不應該存在的東西,等等其實所有的一切。但也不需要成為一個匯編代碼的黑客才能干的事。

結論

如果你覺得需要程序有更好的執行速度,那么,最基本的方法就是使用一個profiler和愿意去查看一下其匯編代碼以找到程序的瓶頸。只有找到了程序的瓶頸,此時才是真正在思考如何去改進的時候,比如思考一個更好的算法,使用更快的語言優化,等等。

常規的做法是制勝法寶是挑選一個最佳的算法而不是進行微優化。雖然這種做法是無可異議的,但是有兩件事情是學校沒有教給你而需要你重點注意的。第一個也是最重要的,如果你優化的算法沒沒有參與到你程序性能中的算法,那么你優化他只是在浪費時間和精力,并且還轉移了你的注意力讓你錯過了應該要去優化的部分。第二點,算法的性能總和處理的數據密切相關的,就算是冒泡排序有那么多的笑柄,但是如果其處理的數據基本是排好序的,只有其中幾個數據是未排序的,那么冒泡排序也是所有排序算法里性能最好的。所以,擔心沒有使用好的算法而不去測量,只會浪費時間,無論是你的還是計算機的。

就好像賽車零件的訂購速底是不會讓你更靠進冠軍(就算是你正確安裝零件也不會),沒有Profiler,你不會知道問題在哪里,不去看匯編,你可能知道問題所在,但你往往不知道為什么。

原文鏈接:Overlooked Essentials For Optimizing Code

譯文鏈接:http://coolshell.cn/articles/2967.html

posted on 2010-09-24 10:15 肥仔 閱讀(794) 評論(1)  編輯 收藏 引用 所屬分類: 其他經驗

評論

# re: 兩個最容易被人忽略的基本代碼優化技術  回復  更多評論   

學習了
2010-10-24 09:19 | shiweifu
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产精品女主播| 亚洲午夜伦理| 亚洲一区二区免费在线| 亚洲午夜伦理| 香港久久久电影| 久久精品国产77777蜜臀| 久久人人97超碰精品888| 欧美高清不卡| 在线视频你懂得一区二区三区| 亚洲午夜精品网| 久久久精品国产一区二区三区| 欧美www在线| 欧美视频在线一区二区三区| 国产日韩一区二区| 亚洲日本中文字幕免费在线不卡| 中文网丁香综合网| 久久伊人精品天天| 中国日韩欧美久久久久久久久| 午夜久久久久久久久久一区二区| 裸体丰满少妇做受久久99精品 | 国产区亚洲区欧美区| 在线成人av.com| 99热在线精品观看| 欧美一区二区三区播放老司机| 欧美 日韩 国产一区二区在线视频 | 欧美jizz19hd性欧美| 欧美三级电影网| 极品少妇一区二区三区精品视频| 99视频精品| 美国成人直播| 亚洲视频在线观看免费| 欧美www视频在线观看| 国产日韩精品一区二区三区| 亚洲精品在线免费观看视频| 久久精品在线观看| 中文日韩欧美| 欧美精品一区二区三区很污很色的| 国内精品久久久久伊人av| 亚洲中无吗在线| 日韩一级大片| 欧美国产第一页| 在线日韩视频| 久久久久久久999| 亚洲欧美中文另类| 国产精品久久久久婷婷| 在线一区视频| 亚洲三级电影全部在线观看高清| 欧美一区视频在线| 国产麻豆精品在线观看| 中文av一区二区| 亚洲精品欧美日韩| 欧美日韩高清在线观看| 亚洲毛片一区| 91久久午夜| 欧美69wwwcom| 日韩视频一区二区三区在线播放免费观看 | 国产精品美女久久久久久2018 | 欧美成年人视频网站| 欧美亚洲在线观看| 国产日韩欧美精品一区| 香蕉久久a毛片| 亚洲一区在线直播| 国产伦精品一区二区三区在线观看| 午夜精品电影| 欧美一区二区视频在线观看| 欧美影院午夜播放| 国产午夜久久| 免费在线欧美视频| 欧美成人按摩| 亚洲一区国产视频| 亚洲欧美日韩综合aⅴ视频| 国产女主播一区二区| 久久久久久久久综合| 久久久久久久综合| 亚洲黄色影院| 夜夜嗨av一区二区三区中文字幕| 欧美日韩一区三区四区| 欧美中文字幕在线播放| 欧美在线你懂的| 亚洲成人在线视频播放| 亚洲精品一线二线三线无人区| 欧美日韩在线电影| 久久久久久久精| 欧美护士18xxxxhd| 亚洲免费在线看| 久久婷婷影院| 亚洲一区二区成人| 久久亚洲色图| 亚洲欧美日韩电影| 久久久精品五月天| 国产精品99久久久久久白浆小说 | 国产精品第一区| 久久青草久久| 欧美日韩另类视频| 麻豆av福利av久久av| 欧美视频在线看| 免费观看成人www动漫视频| 欧美精品观看| 久久男人资源视频| 国产精品嫩草影院av蜜臀| 免费看的黄色欧美网站| 欧美性天天影院| 欧美成人精品一区| 国产欧美日韩三级| av不卡在线| 亚洲区中文字幕| 性欧美在线看片a免费观看| 亚洲最新在线| 蜜臀av在线播放一区二区三区| 午夜精品一区二区三区在线| 欧美成人蜜桃| 裸体丰满少妇做受久久99精品| 欧美午夜视频在线| 91久久久亚洲精品| 亚洲高清毛片| 欧美在线啊v| 欧美一区网站| 欧美午夜不卡视频| 亚洲黄页视频免费观看| 亚洲电影中文字幕| 欧美一级免费视频| 午夜影视日本亚洲欧洲精品| 欧美日韩一视频区二区| 亚洲人在线视频| 亚洲区中文字幕| 免费不卡在线观看| 欧美激情视频一区二区三区不卡| 激情成人亚洲| 99re热这里只有精品免费视频| 欧美一区二区三区四区夜夜大片| 欧美1区视频| 亚洲第一黄网| 亚洲欧洲美洲综合色网| 久久在线免费观看视频| 欧美大胆人体视频| 亚洲精品123区| 欧美精品激情| 一本高清dvd不卡在线观看| 999在线观看精品免费不卡网站| 免费在线看一区| 亚洲盗摄视频| 99精品福利视频| 欧美视频一区在线| 亚洲一区二区三区四区中文| 午夜在线精品偷拍| 国产一区二区三区高清| 久久久国产一区二区| 欧美国产精品一区| 夜夜夜久久久| 国产美女一区二区| 久久精品国产综合精品| 欧美激情bt| 亚洲午夜羞羞片| 国产婷婷色一区二区三区在线| 欧美一区二区三区在线观看 | 99亚洲精品| 欧美在线播放高清精品| 国内一区二区在线视频观看 | 国产尤物精品| 浪潮色综合久久天堂| 亚洲免费大片| 久久精品国产综合| 亚洲精品乱码久久久久久按摩观| 欧美日韩免费在线视频| 欧美一区二区三区啪啪| 欧美激情一区二区三区四区| 一区二区日韩精品| 国产一区二区中文字幕免费看| 欧美1区视频| 香蕉国产精品偷在线观看不卡| 欧美成人免费在线| 欧美一区二区三区喷汁尤物| 亚洲高清资源| 国产欧美精品va在线观看| 免费观看成人| 欧美在线播放一区| 日韩网站在线观看| 久久综合五月| 午夜精品久久久久久久99黑人| 曰韩精品一区二区| 国产欧美韩日| 国产精品大片wwwwww| 欧美成人性网| 久久九九免费视频| 亚洲综合久久久久| 亚洲免费成人| 欧美国产一区在线| 久久久综合视频| 午夜精品一区二区三区四区| 日韩视频在线观看| 一区二区亚洲精品| 国产日韩精品一区二区三区 | 国产精品video| 免费观看成人网| 久久se精品一区精品二区| 亚洲一级在线观看| 夜夜嗨av一区二区三区四季av| 亚洲精品一区二区三区av| 久久国产精品亚洲77777| 一区二区三区日韩精品|