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