你會為了效能而犧牲程式碼簡潔性嗎?
原文作者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
相關文章
- C++程式設計師看過來,你會為了效能而犧牲程式碼簡潔性嗎?C++程式設計師
- 開會:簡直就是犧牲工作!(有圖有真相 :D)
- 老闆會因為你拼命寫程式碼而感謝你嗎?
- 老闆會因為你拼命編寫程式碼而感謝你嗎?
- 犧牲速度來節省記憶體,Redis是覺得自己太快了嗎記憶體Redis
- 使用 Macro 讓你的程式碼更簡潔,更具有可讀性Mac
- 7成使用者忽視資料安全! 犧牲安全的便捷性真就這麼香嗎?
- 你會為跳過廣告而額外付費嗎?
- 你會敲程式碼嗎
- 原始碼為你而開嗎??Is Open Source for You? (轉)原始碼
- 機械硬碟:雲時代的下一個犧牲品?硬碟
- [譯] 利用 Immutability(不可變性)編寫更為簡潔高效的程式碼
- 利用註解+反射消除重複程式碼,你學會了嗎?反射
- JavaScript 程式碼簡潔之道JavaScript
- JavaScript程式碼簡潔之道JavaScript
- 【JS】裝飾器讓你的程式碼更簡潔JS
- 敏捷史話(十):我犧牲了滑雪時間,參加了一場軟體革命——Jon Kern敏捷
- ActiveMQ你學會了嗎MQ
- 程式設計師:你的程式碼為誰而寫?程式設計師
- [翻譯] Async/Await 使你的程式碼更簡潔AI
- 推薦五款簡潔而實用的工具,值得你嘗試
- 程式設計師,你真的會寫簡歷嗎?程式設計師
- 這些手寫程式碼會了嗎?少年
- (譯)保持你的程式碼整潔
- JS程式碼簡潔之道--函式JS函式
- 如何編寫簡潔的程式碼?
- Clean Code PHP 程式碼簡潔之道PHP
- PHP程式碼規範簡潔之道PHP
- PHP 程式碼規範簡潔之道PHP
- 堆排序你真的學會了嗎?排序
- 五個簡單的原則,帶你寫出整潔程式碼
- Kotlin-for-Android : 讓你的Android程式碼更簡潔KotlinAndroid
- 聽說你在為天天寫業務程式碼而煩惱?
- 如何讓你的程式碼整潔漂亮
- PHP程式碼簡潔之道——變數部分PHP變數
- PHP程式碼簡潔之道——函式部分PHP函式
- JAVA基礎之程式碼簡潔之道Java
- 程式碼簡潔的十條建議