丨我們要先實現(xiàn)業(yè)務(wù)功能還是優(yōu)化代碼_第1頁
丨我們要先實現(xiàn)業(yè)務(wù)功能還是優(yōu)化代碼_第2頁
丨我們要先實現(xiàn)業(yè)務(wù)功能還是優(yōu)化代碼_第3頁
丨我們要先實現(xiàn)業(yè)務(wù)功能還是優(yōu)化代碼_第4頁
丨我們要先實現(xiàn)業(yè)務(wù)功能還是優(yōu)化代碼_第5頁
已閱讀5頁,還剩5頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

化與Profiling首先,提到高性能編碼,你肯定聽現(xiàn)代計算機科學(xué)的鼻祖高德納(DonaldKnuth)的Weshouldforgetaboutsmallefficiencies,sayabout97%ofthetime:prematureoptimizationistherootofallevil.Yetweshouldnotpassupouropportunitiesinthatcritical3%.我們應(yīng)該忘掉那些效率低下的事情,告誡自己在97%源。但是,我們也不應(yīng)該在關(guān)鍵的3%——ComputerProgrammingasanArt(1974)不過,可能很多程序員都只記住了這句話的前半部分,“97%的情況下,過早優(yōu)化是萬惡之源”,而沒有注意到這句話還有后半句:我們不應(yīng)該放棄掉那關(guān)鍵的3%的優(yōu)化機所以這樣造成的就是:過度推崇不要對代碼進行提前優(yōu)化,并以此來作為編寫性能C++所以高性能實現(xiàn)的第二個原因代1代1publicclass789Channel[]publicChannels()channels=new}publicreceiveData(...){....}//收到數(shù)據(jù)更新ChannelpublicbooleanhasData //for(ChannelChannel:{if(Channel.dataSize>0){returntrue;}}return}}2{class3publicString4publicint5}6那么在看完代碼之后,你覺得這段代碼實現(xiàn)中的方法hasDat如果你只是根據(jù)這段代碼實現(xiàn)來進行分析,會發(fā)現(xiàn)它好像沒有啥性能問題。畢竟,針對一0個元素的數(shù)組來說,使用二分法查找來提升查找速度的必要性不太大。其實,就我的思考和實踐經(jīng)驗來說,在開發(fā)一個高性能軟件系統(tǒng)的時候,在編碼階段考慮高性能的實現(xiàn)方法,與完成業(yè)務(wù)功能后再進行代碼調(diào)優(yōu)之間并不,這二者應(yīng)該被同等地重視起來。因為前期的高性能編碼實現(xiàn)過程,很多都是由人來控制的,所以可能會由于判斷確或者實現(xiàn)過程不,引入一些低效率的代碼實現(xiàn)。這樣一來,期通過熱點代碼分析以及代碼調(diào)優(yōu)的過程,就是不能省略的。所以,今天我主要是從編寫的代碼映射到執(zhí)行過程的角度和,分別是循環(huán)實現(xiàn)、函數(shù)方法實現(xiàn)、表達式實以及中,實現(xiàn)的功能是循環(huán)遍歷并更新字符串中的值,你會發(fā)現(xiàn)在循環(huán)執(zhí)行的過程中,被調(diào)用了很多次,所以性能比較低。代代voidupdateStr(char*{for(inti=0;i<strlen(str);{ str[i]= 7代代voidupdateStr(char*{intlength=for(inti=0;i<length;{ str[i]= 8我們同樣也來看一個反模式的代碼示例。在下面這段代碼的實現(xiàn)過程中,xy生變化,但是在循環(huán)體中被執(zhí)行了很多遍。代代1voidinitData(int[]data,intlength,intx,int223456for(inti=0;i<length;{data[i]=x*y+}}因此,站在高性能編碼實現(xiàn)的角度,我們可以把*y其實到這里,你可以記住一句話:其實不同的編程語言,支撐函數(shù)方法內(nèi)聯(lián)的語法和機制有一定的差異。在Java語言的開發(fā)過程中,我推薦你盡量使用final來定義方法,因為這種場景下,Java的JIT會有比較大的C++InlineC的本是函針,要在過程取內(nèi)變量,來判碼需要跳轉(zhuǎn)到哪個位置。而這種運行期動態(tài)決定跳轉(zhuǎn)地址,就很容易導(dǎo)致指令集流水線的中斷,造成指令Caches的概率增大,從而引起性能下降。不過在Java語言中,因為類方法模式都是抽象的,所以我們可以將關(guān)鍵方法定義成靜態(tài)方法,從而避免多態(tài)調(diào)用;對于C++來說,在定義類方法的時候,我們可以根據(jù)需求來決定是否需要使用抽象方法,以此減少不必要的多態(tài);而在C的問題,所這里我就不展開介紹了。代代1inty=x*那么,對于高性能的編譯器來說(如新版的GCC9.x等),就可以將這個乘法操作優(yōu)化為比如你下面的代碼,這是一個包含了3個乘法運算的表達式代代1intz=32*x*432*代代12intz=x*x+y;//intz=x*(x+y);//CPU首先你要知道的是,控制流程代碼在執(zhí)行的過程中,CPU執(zhí)行會通過指令分支預(yù)測,提前將接下來的執(zhí)行指令搬移到Cache中,如果預(yù)測失敗,就有可能引起指令流水線中斷,從這里,我也給你一下我在實踐過程中總結(jié)出來的經(jīng)驗,即盡量減少不必要的分支判斷。x==2x==3代代123456789if(2==x){}if(3==x){}if(4==x){}//場景switch利用表驅(qū)動來減少switch邏輯和小的for循環(huán)平鋪執(zhí)行,等等。所以這里,我給你一個小建議,就是在一些特殊場景下(if景),你可以考慮使用switch來替換if,這樣也有可能改善代碼的執(zhí)行性能。今天這節(jié)課,我?guī)阋黄鹛接懥烁咝阅芫幋a的價值觀,其實我的觀念就是,碼實現(xiàn)需要和后期的代碼熱點調(diào)優(yōu)一起互相配合,而不是孤立地去看待其中一個,這樣才會更容易開發(fā)出高性能的軟件。另外,在明確了高性能實現(xiàn)的價值之后,你還要清楚應(yīng)該從哪些要點出發(fā),去思考實現(xiàn)高性能編碼,以及在高性能編碼中針對一些典型業(yè)務(wù)場景的實現(xiàn)。你可以先理解和掌握這節(jié)課我給你的四種高性能編碼實現(xiàn)的方法思路,然后按照這個思路,逐步積累和提升高性能編碼的能力,從而幫助你最終開發(fā)出高性能的代碼。每一種編程語言都在不斷

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論