你會為了效能而犧牲程式碼簡潔性嗎?

csdn發表於2015-05-16

  原文作者Arne Mertz是一位C++狂熱份子,有著豐富的開發經驗。文中Arne Mertz針對簡潔和效能的關係進行闡述,他認為,開發者不到萬不得已時千萬不要為了效能而犧牲簡潔性,要學會使用工具來解決效能問題。

  譯文如下:

  C++的強項之一是能寫出非常高效能的程式碼。那麼在實際中,我們該如何把握好效能處理的尺度呢?

  效能≠效率

  首先要明確的一點是我們必須把效能和效率區分清楚。這兩者分別代表什麼?

  • 我們能做得多快(效能);
  • 它需要多長時間去完成(效率)。

  這看上去好像差不多,但其實不是。舉個例子,假設你需要從A點到B點,效率意味著“最短路徑”,效能意味著“以跑代走”。因此,即使以博爾特的速度到達終點,雖然高效能,但並不高效—“沒有選擇最短路徑”。

  對於程式來說,迴圈通常會耗費不少時間。這種情況下,效能意味著“單個迴圈用時越短越好”,效率意味著“儘量降低迴圈層數”。

  效能並非程式的全部

  這是很淺顯的道理,但往往容易被忽視,特別是程式設計師新手。在不少程式設計論壇裡,涉及程式碼效能優化的提問比比皆是。

  有個說法是80%的程式執行時間是由約20%程式碼決定的,還有的說是90%/10%。因此,對於程式來說,關鍵運算程式碼可能僅存在於某小部分程式碼中。所以,如果把精力放在所有程式碼的優化上,而不重點主攻關鍵程式碼,其實是事倍功半的。

  我們真的不懂如何寫高效能的程式碼?

  事實上,決定程式執行時長主要的因素是指令數的多少,但這不是由我們控制而是由編譯器及其優化器所控制的。

  優化器種類繁多,除非是該領域的專家,否則很難明白它對程式碼做了哪些優化工作。優化器可以銷燬臨時物件,可以行內函數,可以清除更多其它指令。

  所以當這些不確定因素存在時,我們還能寫出絕對高效能程式碼嗎?如果真的很在意效能,我建議使用工具來輔助完成。

  但也不必太悲觀。如果有兩種或更多的方法來寫出同樣可讀的程式碼,那麼不妨選擇最高效能的寫法。例如,在不儲存結果的情況下,可以使用++iter來代替iter++。

  效能和簡單並不總是矛盾

  影響程式執行時間的另一個重要因素是記憶體中資料的佈局和結構。詳細請參考Chandler Carruth的文章Efficiency with Algorithms, Performance with Data Structures

  補充一點,假如資料的記憶體佈局不優良,那麼會造成要花費很多時間來從獲取資料,同時會造成指令冗餘。

  對於簡潔和效能的關係,還可以參考文章Using the libraries you have, and using them right

  小結

  建議預設編寫出可讀和簡單的程式碼。如果你真的發現存在效能問題並已經找出其位置,那麼仍然有很多選擇來對此進行處理而不必為了追求快而寫出複雜的程式碼。不到萬不得已不要為了效能而犧牲簡潔性,同時要學會使用工具來解決效能問題。

  那麼問題來了,你會為了效能而犧牲程式碼簡潔性嗎?

  英文出自:arne-mertz.de

相關文章