原文作者Arne Mertz是一位C++狂熱份子,有著豐富的開發經驗,
他針對簡潔和性能的關系進行闡述,他認為,開發者不到萬不得已時千萬不要為了性能而犧牲簡潔性,要學會使用工具來解決性能問題,
C++的強項之一是能寫出非常高性能的代碼,那么在實際中,我們該如何把握好性能處理的尺度呢?
性能≠效率
首先要明確的一點是我們必須把性能和效率區分清楚,這兩者分別代表什么?
● 我們能做得多快(性能);
● 它需要多長時間去完成(效率),
這看上去好像差不多,但其實不是,舉個例子,假設你需要從A點到B點,效率意味著“最短路徑”,性能意味著“以跑代走”,因此,即使以博爾特的速度到達終點,雖然高性能,但并不高效—“沒有選擇最短路徑”,
對于程式來說,回圈通常會耗費不少時間,這種情況下,性能意味著“單個回圈用時越短越好”,效率意味著“盡量降低回圈層數”,
性能并非程式的全部
這是很淺顯的道理,但往往容易被忽視,特別是程式員新手,在不少編程論壇里,涉及代碼性能優化的提問比比皆是,
有個說法是80%的程式運行時間是由約20%代碼決定的,還有的說是90%/10%,因此,對于程式來說,關鍵運算代碼可能僅存在于某小部分代碼中,所以,如果把精力放在所有代碼的優化上,而不重點主攻關鍵代碼,其實是事倍功半的,
我們真的不懂如何寫高性能的代碼?
事實上,決定程式運行時長主要的因素是指令數的多少,但這不是由我們控制而是由編譯器及其優化器所控制的,
優化器種類繁多,除非是該領域的專家,否則很難明白它對代碼做了哪些優化作業,優化器可以銷毀臨時物件,可以行內函式,可以清除更多其它指令,
所以當這些不確定因素存在時,我們還能寫出絕對高性能代碼嗎?如果真的很在意性能,我建議使用工具來輔助完成,
但也不必太悲觀,如果有兩種或更多的方法來寫出同樣可讀的代碼,那么不妨選擇最高性能的寫法,例如,在不存盤結果的情況下,可以使用++iter來代替iter++,
性能和簡單并不總是矛盾
影響程式運行時間的另一個重要因素是記憶體中資料的布局和結構,
補充一點,假如資料的記憶體布局不優良,那么會造成要花費很多時間來從獲取資料,同時會造成指令冗余,
總結
建議默認撰寫出可讀和簡單的代碼,如果你真的發現存在性能問題并已經找出其位置,那么仍然有很多選擇來對此進行處理而不必為了追求快而寫出復雜的代碼,不到萬不得已不要為了性能而犧牲簡潔性,同時要學會使用工具來解決性能問題,
那么問題來了,你會為了性能而犧牲代碼簡潔性嗎?

最后,不管你是轉行也好,初學也罷,進階也可,如果你想學編程~
【值得關注】我的 C/C++編程學習交流俱樂部!【點擊進入】
問題答疑,學習交流,技術探討,還有超多編程資源大全,零基礎的視頻也超棒~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/250431.html
標籤:C++
