原則
《More Effective C++》書中效率部分第一條就是80—20準則。說得是——大約 20%的代碼使用了 80%的程序資源;大約 20%的代碼耗用了大約 80%的運行時間;大約 20%的代碼使用了 80%的內存。因此,一些簡單的優化也能顯著提高程序性能。
先完成程序功能,再考慮性能優化的事,否則會出現代碼可讀性差,過度抽象等問題。
大部分的性能優化其實都是在做時間和空間的權衡,空間換時間,或者時間換空間。
良好的代碼風格和代碼規範能有效的避免性能問題的出現,所以codereview也很重要。
我們真正想大幅度的提升程序性能需要藉助程序分析器(profiler)尋找出程序的性能瓶頸,針對這個瓶頸進行代碼層面,算法層面,架構層面等多方面的優化。
常用優化方法
空間足夠時,可以將經常需要讀取的資源,緩存在內存中。
儘量減少大內存對象的構造與析構,考慮緩存暫時不用的對象,等待後續繼續使用。
儘量使用C++11的右值語義,減少臨時對象的構造。
簡單的功能函數可以使用內聯。少用繼承,多用組合,儘量減少繼承層級。
在循環遍歷時,優化判斷條件,減少循環次數。
優化線程或進程的同步方式,能用原子操作的就不用鎖。能應用層同步的就不用內核對象同步。
優化堆內存的使用,如果有內存頻繁的申請與釋放,可以考慮內存池。
優化線程的使用,節省系統資源與切換造成的性能損耗,線程使用頻繁的可以考慮線程池。
儘量使用事件通知,謹慎使用輪循或者sleep函數。
界面開發中,耗時的業務代碼不要放在UI線程中執行,使用單獨的線程去異步處理耗時業務,提高界面響應速度。
經常重構、優化代碼結構。優化算法或者架構,從設計層面進行性能的優化。