- Go語(yǔ)言高效編程:原理、可觀測(cè)性與優(yōu)化
- (波蘭)巴特洛米·普洛特卡
- 1733字
- 2025-05-07 12:18:22
1.1 性能的深意
在探討為什么軟件效率和性能優(yōu)化如此重要之前,我們必須深刻理解一個(gè)已經(jīng)被濫用的詞——性能。在軟件工程中,這個(gè)詞用在很多場(chǎng)景中,不同的場(chǎng)景有不同的意思,所以我們需要從多個(gè)角度來(lái)理解它。
當(dāng)有人說(shuō)“此應(yīng)用程序性能不佳”時(shí),他一般是指該應(yīng)用程序運(yùn)行緩慢[1]。但當(dāng)同一個(gè)人說(shuō)“Bartek在工作中表現(xiàn)不佳”時(shí)(英文performance是個(gè)多義詞,這里取其“性能”與“表現(xiàn)”之義),并不是說(shuō)Bartek從工位到會(huì)議室走得太慢。根據(jù)筆者的觀察,在軟件研發(fā)領(lǐng)域,有相當(dāng)多的人認(rèn)為“性能”與”速度”是同義詞,而有部分人則認(rèn)為,它代表軟件運(yùn)行的整體質(zhì)量,這其實(shí)是這個(gè)詞最初的定義。這種現(xiàn)象被稱為“語(yǔ)義擴(kuò)散”(https://oreil.ly/Qx9Ft),當(dāng)一個(gè)詞被更大的群體使用時(shí),它的含義就會(huì)與最初的定義產(chǎn)生差異[2]。
計(jì)算機(jī)性能中的“性能”一詞與其他領(lǐng)域的“性能”含義基本相同,它大概描述的是“計(jì)算機(jī)完成既定任務(wù)的表現(xiàn)如何”。
——Arnold O.Allen,Introduction to Computer PerformanceAnalysis with Mathematica(Morgan Kaufmann,1994)
筆者認(rèn)為Arnold對(duì)于性能的描述已經(jīng)非常接近它的本義了。
注意“性能”一詞的使用場(chǎng)景
當(dāng)我們?cè)陂喿x文檔、代碼、錯(cuò)誤堆棧或參加技術(shù)分享會(huì)時(shí),遇到“性能”這個(gè)詞時(shí)要格外注意,必要時(shí)請(qǐng)結(jié)合語(yǔ)境來(lái)理解,以避免曲解作者的意思。
在實(shí)際工作當(dāng)中,性能可以用來(lái)衡量軟件運(yùn)行的整體質(zhì)量,但是它的含義遠(yuǎn)比我們了解的要深得多。可能你會(huì)覺(jué)得這有點(diǎn)故弄玄虛,但請(qǐng)思考一下,如果我們想要提升軟件研發(fā)的綜合效益,是不是必須得保證研發(fā)過(guò)程中保持流暢且高效的溝通呢?
所以,筆者建議在我們真正理解“性能”在具體場(chǎng)景中的含義之前,不要隨意使用它,免得引起誤解。比如,當(dāng)你往Github issue中提交錯(cuò)誤信息的時(shí)候,千萬(wàn)不要隨意來(lái)一句“性能真差”,而不加以任何的描述說(shuō)明,這會(huì)讓項(xiàng)目維護(hù)者感到一頭霧水。同樣,在提交代碼變更時(shí),不要在變更日志[3]中用類似“提高了性能”這樣的描述,誰(shuí)會(huì)知道你的變更是減少了用戶輸入錯(cuò)誤、優(yōu)化了內(nèi)存使用率,還是提升了程序執(zhí)行速度呢?你至少需要說(shuō)清楚提高了什么性能,以及是怎樣提高的。將場(chǎng)景與細(xì)節(jié)描述清楚,對(duì)大家都好。
筆者在本書(shū)中凡是提及該詞,都會(huì)明確說(shuō)明上下文。當(dāng)我們遇到有人使用性能這個(gè)詞的時(shí)候,可以使用圖1-1中展示的方式來(lái)思考:

圖1-1:性能的定義
從原則上來(lái)說(shuō),“軟件性能”一般表示“軟件運(yùn)行情況的好壞”,它由以下三大核心要素支撐。
準(zhǔn)確率
表示運(yùn)行周期中符合預(yù)期的任務(wù)數(shù)量或比率。在軟件領(lǐng)域中,通常通過(guò)排除掉應(yīng)用程序產(chǎn)生錯(cuò)誤的結(jié)果數(shù)量來(lái)衡量軟件性能。例如,We b類系統(tǒng)中已完成且響應(yīng)狀態(tài)碼為非200的請(qǐng)求數(shù)量。
速度
表示執(zhí)行任務(wù)中所有工作的速度快慢與時(shí)效性,一般通過(guò)觀察延遲與吞吐量來(lái)獲得。例如,壓縮1GB數(shù)據(jù)需要10s,或者系統(tǒng)具有100MBps的吞吐量,都可以用來(lái)表示速度。
效率
表示一個(gè)運(yùn)行中的系統(tǒng)對(duì)外提供的能力與它本身需要的外部干預(yù)的比值,即效能比。通俗地講,就是付出了多少成本,獲得了多少收益。例如,程序需要在內(nèi)存分配420字節(jié)的數(shù)據(jù)用于計(jì)算獲取64字節(jié)的數(shù)據(jù),就可以說(shuō)這個(gè)過(guò)程對(duì)內(nèi)存的利用效率約等于15%。
這里的15%并不是絕對(duì)意義上的效率值,因?yàn)槲覀儾](méi)有算上CPU時(shí)間、電力消耗、熱量等其他外部資源。因此效率和我們的主觀意識(shí)的邊界有關(guān),在我們的例子中就是內(nèi)存空間。總而言之,性能至少是以上三要素的組合:
性能=(準(zhǔn)確率×速度×效率)
優(yōu)化三要素中的任何一個(gè)都可以提升應(yīng)用程序的性能,提升諸如可靠性、可用性、彈性、整體延遲等。同樣,忽視這些中的任何一項(xiàng)都會(huì)使我們的軟件變得不那么有用(less useful)[4]。在性能優(yōu)化的過(guò)程中,何時(shí)停止優(yōu)化是關(guān)鍵,三要素表面上沒(méi)有關(guān)聯(lián),實(shí)則相輔相成。例如,在保證準(zhǔn)確率的情況下,是可以實(shí)現(xiàn)更好的可靠性和可用性的。又例如,為了提升程序性能,降低內(nèi)存占用可以顯著降低應(yīng)用程序發(fā)生內(nèi)存泄漏的概率。本書(shū)就側(cè)重于研究這部分知識(shí)、技術(shù)與方法,探究如何在不降低準(zhǔn)確率的情況下提升程序代碼運(yùn)行的速度與效率。
書(shū)名的由來(lái)
筆者的目標(biāo)是傳授最實(shí)用的技能,讓讀者能夠較為輕松地編寫(xiě)出高質(zhì)量、高性能的代碼。為此,當(dāng)筆者提到代碼的整體性能時(shí)(未提及特定資源),指的是代碼運(yùn)行的速度和效率。
“性能”一詞的誤用只是軟件效率這一主題的冰山一角,實(shí)際情況是,許多更加嚴(yán)重的誤區(qū)正在加速摧毀軟件的質(zhì)量。從好的方面來(lái)看,這僅僅是一堆冗雜的巨量代碼,但更糟糕的情況是,它會(huì)間接引起社會(huì)和財(cái)務(wù)組織管理問(wèn)題。
- Getting Started with Citrix XenApp? 7.6
- Visual Basic程序設(shè)計(jì)習(xí)題解答與上機(jī)指導(dǎo)
- SQL Server 2016數(shù)據(jù)庫(kù)應(yīng)用與開(kāi)發(fā)
- Vue.js 2 Web Development Projects
- 案例式C語(yǔ)言程序設(shè)計(jì)實(shí)驗(yàn)指導(dǎo)
- Zabbix Performance Tuning
- JSP程序設(shè)計(jì)與案例實(shí)戰(zhàn)(慕課版)
- WCF技術(shù)剖析(卷1)
- Android嵌入式系統(tǒng)程序開(kāi)發(fā)(基于Cortex-A8)
- 讓Python遇上Office:從編程入門(mén)到自動(dòng)化辦公實(shí)踐
- Web開(kāi)發(fā)新體驗(yàn)
- INSTANT PLC Programming with RSLogix 5000
- C語(yǔ)言程序設(shè)計(jì)
- Oracle Database 12c DBA官方手冊(cè)(第8版)
- PHP高性能開(kāi)發(fā):基礎(chǔ)、框架與項(xiàng)目實(shí)戰(zhàn)