您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++的優(yōu)化有哪些”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C++的優(yōu)化有哪些”吧!
1. 性能指標(biāo)要靠測(cè)量,不能靠猜:
我做過一段時(shí)間的SDK開發(fā)工作,每當(dāng)我們發(fā)版SDK時(shí)候,都要附帶著SDK使用文檔以及性能測(cè)試報(bào)告,性能測(cè)試報(bào)告里面有很詳細(xì)的指標(biāo)測(cè)試數(shù)據(jù),這個(gè)數(shù)據(jù)當(dāng)然不能是自己猜測(cè)出來的,一定要進(jìn)行測(cè)試。
2. 帕累托法則
帕累托法則,也稱二八原則,80%的執(zhí)行時(shí)間花在大約20%代碼身上,80%的內(nèi)存被大約20%的代碼使用,80%的維護(hù)成本花在20%的代碼上面。我們做程序優(yōu)化也是如此,多數(shù)情況下也許我們只需要找到那20%代碼,對(duì)其進(jìn)行深度優(yōu)化,基本上就可以滿足性能要求。
3. 阿姆達(dá)爾定律
SPRING
阿姆達(dá)爾定律:有一個(gè)公式,公式中:St表示優(yōu)化后整體性能提升的比例,P表示被優(yōu)化部分運(yùn)行時(shí)間占總運(yùn)行時(shí)間的比例,Sp表示被優(yōu)化部分性能提升的比例。
舉個(gè)例子:
1. 程序運(yùn)行時(shí)間100s,其中有90s調(diào)用函數(shù)func,func優(yōu)化后性能提升30%,即P=90/100=0.9,Sp=1+30%=1.3,則程序整體效率為St=1/((1-0.9)+0.9/1.3)=1.26214,程序整體性能提升了26%。
2. 程序運(yùn)行時(shí)間100s,其中有10s調(diào)用函數(shù)func,func優(yōu)化后性能提升80%,即P=10/100=0.1,Sp=1+80%=1.8,則程序整體效率為St=1/((1-0.1)+0.1/1.8)=1.04651,程序整體性能提升了4%。
該定律其實(shí)也間接驗(yàn)證了帕累托法則的正確性,去優(yōu)化那些至關(guān)重要的部分吧。
聊完了性能優(yōu)化的原則,再來說下我的優(yōu)化系列規(guī)劃吧,目前打算優(yōu)化大體分為以下幾個(gè)專題:
1. 測(cè)量分析專題:例如使用什么函數(shù)來測(cè)量函數(shù)耗時(shí),使用什么代碼分析工具來動(dòng)態(tài)和靜態(tài)的分析代碼。例如:
2. 編碼規(guī)范專題:分析C++各種操作的效率,包括不同類型變量的存儲(chǔ)效率,使用智能指針、循環(huán)、函數(shù)參數(shù)、虛函數(shù)、數(shù)組等的效率,以及如何更好的利用他們進(jìn)行代碼優(yōu)化。例如各個(gè)操作占用的時(shí)鐘周期:
3. 編譯優(yōu)化專題:各種編譯器性能分析,理解常見的編譯優(yōu)化選項(xiàng),分析編譯器是如何對(duì)代碼進(jìn)行優(yōu)化的,都做了什么優(yōu)化,以及編譯器優(yōu)化的障礙(它不能做什么),如何充分利用好編譯器的優(yōu)化選項(xiàng)。例如優(yōu)化編譯器優(yōu)化級(jí)別介紹:
O0(默認(rèn)選項(xiàng)):不開啟優(yōu)化,方便功能調(diào)試
Og:方便調(diào)試的優(yōu)化選項(xiàng)(比O1更保守)
O1:保守的優(yōu)化選項(xiàng),打開了四十多個(gè)優(yōu)化選項(xiàng)
Os:產(chǎn)生較小代碼體積的優(yōu)化選項(xiàng)(比O2更保守)
O2:常用的發(fā)布優(yōu)化選項(xiàng),在O1的基礎(chǔ)上額外打開了四十多個(gè)優(yōu)化選項(xiàng),包括自動(dòng)內(nèi)聯(lián)等規(guī)則
O3:較為激進(jìn)的優(yōu)化選項(xiàng)(對(duì)錯(cuò)誤編碼容忍度最低),在O2的基礎(chǔ)上額外打開了十多個(gè)優(yōu)化選項(xiàng)
Ofast:打開可導(dǎo)致不符合IEEE浮點(diǎn)數(shù)等標(biāo)準(zhǔn)的性能優(yōu)化選項(xiàng)。
如圖:
4. 內(nèi)存優(yōu)化專題:內(nèi)存使用情況往往是影響程序性能的關(guān)鍵因素,該專題會(huì)介紹如何有效利用緩存,如何操作緩存,優(yōu)化內(nèi)存訪問速度,如何使用更少的內(nèi)存,如何防止內(nèi)存抖動(dòng),內(nèi)存對(duì)齊等等。
5. 多線程優(yōu)化專題:如何充分利用CPU,如何做好線程同步,如何使用鎖,使用什么鎖,理解和調(diào)試上下文切換,如何使關(guān)鍵線程運(yùn)行效率更高等等。
6. 亂序執(zhí)行專題:理解CPU的亂序執(zhí)行策略,如何利用此特性寫出高效代碼。
7. 矢量運(yùn)算專題:理解CPU的矢量運(yùn)算以及各種指令集、寄存器以及內(nèi)置函數(shù),提高數(shù)據(jù)計(jì)算的效率。
8. 特殊的優(yōu)化編碼技巧:這里會(huì)介紹很多高效的編碼技巧,如何降低分支預(yù)測(cè)率,如何優(yōu)化低效的除法操作,如何更好的進(jìn)行數(shù)據(jù)邊界檢查,介紹一些高效的數(shù)學(xué)函數(shù)庫等等。
9.模板元編程的編碼技巧:如何利用模板編程來優(yōu)化程序運(yùn)行效率。
10.大雜燴:其它一些實(shí)用小技巧。
介紹到這里,向大家推薦個(gè)好用的網(wǎng)站鏈接,第一個(gè)是:https://godbolt.org/
點(diǎn)擊查看高清圖片
如圖,輸入C++代碼,在右半部分會(huì)顯示編譯器編譯后的匯編代碼,通過查看高級(jí)語言背后的匯編指令我們可以更好的分析代碼的性能。網(wǎng)站更強(qiáng)大的功能是它支持市面上幾乎所有的編譯器,而且各個(gè)版本都有。
如圖,該網(wǎng)站右半部分會(huì)展示編譯器眼中的代碼,對(duì)于我們分析程序也有很大幫助。
感謝各位的閱讀,以上就是“C++的優(yōu)化有哪些”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)C++的優(yōu)化有哪些這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。