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

下載本文檔

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

文檔簡(jiǎn)介

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

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論