原文作者Arne Mertz是一位C++狂熱份子,有著豐富的開發(fā)經(jīng)驗。文中Arne Mertz針對簡潔和性能的關(guān)系進行闡述,他認為,開發(fā)者不到萬不得已時千萬不要為了性能而犧牲簡潔性,要學會使用工具來解決性能問題。
譯文如下:
C++的強項之一是能寫出非常高性能的代碼。那么在實際中,我們該如何把握好性能處理的尺度呢?
性能≠效率
首先要明確的一點是我們必須把性能和效率區(qū)分清楚。這兩者分別代表什么?
- 我們能做得多快(性能);
- 它需要多長時間去完成(效率)。
這看上去好像差不多,但其實不是。舉個例子,假設你需要從A點到B點,效率意味著“最短路徑”,性能意味著“以跑代走”。因此,即使以博爾特的速度到達終點,雖然高性能,但并不高效—“沒有選擇最短路徑”。
對于程序來說,循環(huán)通常會耗費不少時間。這種情況下,性能意味著“單個循環(huán)用時越短越好”,效率意味著“盡量降低循環(huán)層數(shù)”。
性能并非程序的全部
這是很淺顯的道理,但往往容易被忽視,特別是程序員新手。在不少編程論壇里,涉及代碼性能優(yōu)化的提問比比皆是。
有個說法是80%的程序運行時間是由約20%代碼決定的,還有的說是90%/10%。因此,對于程序來說,關(guān)鍵運算代碼可能僅存在于某小部分代碼中。所以,如果把精力放在所有代碼的優(yōu)化上,而不重點主攻關(guān)鍵代碼,其實是事倍功半的。
我們真的不懂如何寫高性能的代碼?
事實上,決定程序運行時長主要的因素是指令數(shù)的多少,但這不是由我們控制而是由編譯器及其優(yōu)化器所控制的。
優(yōu)化器種類繁多,除非是該領(lǐng)域的專家,否則很難明白它對代碼做了哪些優(yōu)化工作。優(yōu)化器可以銷毀臨時對象,可以內(nèi)聯(lián)函數(shù),可以清除更多其它指令。
所以當這些不確定因素存在時,我們還能寫出絕對高性能代碼嗎?如果真的很在意性能,我建議使用工具來輔助完成。
但也不必太悲觀。如果有兩種或更多的方法來寫出同樣可讀的代碼,那么不妨選擇最高性能的寫法。例如,在不存儲結(jié)果的情況下,可以使用++iter來代替iter++。
性能和簡單并不總是矛盾
影響程序運行時間的另一個重要因素是內(nèi)存中數(shù)據(jù)的布局和結(jié)構(gòu)。詳細請參考Chandler Carruth的文章Efficiency with Algorithms, Performance with Data Structures。
補充一點,假如數(shù)據(jù)的內(nèi)存布局不優(yōu)良,那么會造成要花費很多時間來從獲取數(shù)據(jù),同時會造成指令冗余。
對于簡潔和性能的關(guān)系,還可以參考文章Using the libraries you have, and using them right。
小結(jié)
建議默認編寫出可讀和簡單的代碼。如果你真的發(fā)現(xiàn)存在性能問題并已經(jīng)找出其位置,那么仍然有很多選擇來對此進行處理而不必為了追求快而寫出復雜的代碼。不到萬不得已不要為了性能而犧牲簡潔性,同時要學會使用工具來解決性能問題。
英文出自:arne-mertz.de
via:CSDN
哈爾濱品用軟件有限公司致力于為哈爾濱的中小企業(yè)制作大氣、美觀的優(yōu)秀網(wǎng)站,并且能夠搭建符合百度排名規(guī)范的網(wǎng)站基底,使您的網(wǎng)站無需額外費用,即可穩(wěn)步提升排名至首頁。歡迎體驗最佳的哈爾濱網(wǎng)站建設。
