自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

帶著10萬字的草稿,C++優(yōu)化系列來了!

開發(fā) 后端
我做過一段時(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è)試。

 [[379654]]

本文轉(zhuǎn)載自微信公眾號(hào)「程序喵大人」,作者程序喵大人。轉(zhuǎn)載本文請(qǐng)聯(lián)系程序喵大人公眾號(hào)。

大家好,我是程序喵。

不知不覺又到周一了,你是不是還在床上?看到這條推送的時(shí)候,如果你已起床,請(qǐng)?jiān)谠u(píng)論區(qū)扣1,讓程序喵看看有多少人和我一樣勤奮!最近C++技術(shù)交流群發(fā)現(xiàn)了很多水平很高的朋友,歡迎大家來加喵哥微信,進(jìn)群一起討論計(jì)算機(jī)知識(shí)!

近期我會(huì)推出一系列C++優(yōu)化文章,可能因?yàn)橐^年的原因,發(fā)現(xiàn)最近閱讀量明顯下降,所以硬核系列文章會(huì)在年后更新,這篇文章先吊一吊大家胃口,作為引言吧。

我們平時(shí)編寫工程程序時(shí),除了功能可用性外,性能也是最主要的考慮因素。編寫功能可用的代碼很容易,往往難到我們的不是實(shí)現(xiàn)某個(gè)功能,困難的永遠(yuǎn)是保證功能可用的同時(shí)又能滿足對(duì)性能的要求。

一般公司對(duì)程序的體積以及運(yùn)行速度都有嚴(yán)格的要求,有時(shí)候因?yàn)閹鬃止?jié)的代碼段體積或者多了幾十毫秒的運(yùn)行時(shí)間,整個(gè)項(xiàng)目就達(dá)不到驗(yàn)收標(biāo)準(zhǔn),導(dǎo)致不能成功上線。說了這么多只是為了突出性能優(yōu)化的重要性。如何做好優(yōu)化才能體現(xiàn)一個(gè)C++程序員的真正水平。

關(guān)于性能優(yōu)化,有三個(gè)概念我們需要了解:

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è)版本都有。

如果我們看匯編代碼比較吃力,那可以上這個(gè)網(wǎng)站:

https://cppinsights.io/

如圖,該網(wǎng)站右半部分會(huì)展示編譯器眼中的代碼,對(duì)于我們分析程序也有很大幫助。

 

責(zé)任編輯:武曉燕 來源: 程序喵大人
相關(guān)推薦

2024-01-11 09:53:31

面試C++

2021-12-10 12:20:06

LinuxCC++

2022-04-25 10:56:33

前端優(yōu)化性能

2023-10-31 12:58:00

TypeScriptJavaScript

2021-03-16 08:21:29

Spark系統(tǒng)并行

2023-03-30 08:28:57

explain關(guān)鍵字MySQL

2020-09-25 10:50:56

C++語言代碼

2021-11-11 09:27:02

技術(shù)RedisMySQL

2024-07-19 08:34:18

2024-08-13 15:07:20

2023-01-06 08:15:58

StreamAPI接口

2021-10-18 11:58:56

負(fù)載均衡虛擬機(jī)

2022-09-06 08:02:40

死鎖順序鎖輪詢鎖

2020-11-11 11:11:23

Linux內(nèi)核源碼

2024-03-07 18:11:39

Golang采集鏈接

2022-07-04 15:56:55

智能方案

2009-02-26 11:15:03

2021-01-19 05:49:44

DNS協(xié)議

2024-12-31 00:00:01

驅(qū)動(dòng)設(shè)計(jì)應(yīng)用場(chǎng)景業(yè)務(wù)邏輯

2024-08-30 10:29:21

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)