程序性能優化策略

列舉幾點常見的性能優化策略。

n 用空間換時間。該策略屬於系統架構層面的優化。我們知道,各種緩存機制,從CPU L1/L2/RAM到硬盤,都可以通過空間換時間的策略。這類策略基本上是通過採用把計算的過程一步一步地保存或者緩存等方式,避免重複計算的發生。具體的方式可以採用數據緩衝、CDN等。類似的策略還表現爲諸如冗餘數據,比如數據鏡像、負載均衡等。

n 用時間換空間。該策略也屬於系統架構層面的優化。有時候使用少量的空間,可能性能會更好。比如網絡傳輸,如果有一些壓縮數據的算法,例如Huffman編碼壓縮算法[1],該算法本身運行過程其實很耗時,但是因爲整體來看性能瓶頸在網絡傳輸部分,所以用時間來換空間反而能省時間。

n 簡化代碼。該策略屬於基礎技術層面的優化。最高效的程序就是不執行任何代碼的程序,所以,大多數情況下我們可以認爲代碼越少性能就越高。關於代碼級優化的技術,大學的教科書中有很多示例了。比如,減少循環的層數、減少遞歸、在循環中少聲明變量、少做分配和釋放內存的操作、儘量把循環體內的表達式抽到循環外、條件表達式中的多個條件判斷的次序、儘量在程序啓動時把一些東西準備好、注意函數調用的開銷(棧上開銷)、注意面嚮對象語言中臨時對象的開銷、小心使用異常(不要用異常來檢查一些可接受可忽略並經常發生的錯誤),等。這類知識需要我們非常瞭解編程語言和常用的語言自帶資源庫。從根本上來講,不一定越少的代碼越好,我們需要了解Java本地庫的實現原理,例如同步問題,如果單純採用同步鎖(Synchronized)的方式,代碼確實很少,但是實際的性能並不好,當大量線程同時訪問代碼塊時,它會生成大量的鎖,導致系統內部代碼塊互相等待,具體我們會在第5章詳細介紹。所以,我們還是要有一定技術基礎之後才能做到代碼上的簡化。

n 並行處理。該策略屬於一種綜合性策略。試想,如果CPU只有一個核,你要是還採用多進程、多線程的方式編寫代碼,那麼計算密集型需求的應用程序反而會更慢,這是由巨大的操作系統調度和切換開銷所導致的,這類型優化策略只能依靠多核CPU才能真正體現出多進程多線程的優勢。實際應用過程中,我們會針對不同CPU進行大量高併發、密集型任務測試,不一定核數多就一定是最佳選擇,也有些情況需要單核能力強的CPU,然後採用資源隔離技術對CPU核上的計算資源進行切分,把應用程序線程部署到不同的隔離區域,這樣可以保證更多的並行程序同步進行,這也與整個系統的架構、內存共享策略、任務調度機制等多方面因素相關聯。並行處理需要我們的程序擁有擴展性,不能水平或垂直擴展的程序無法進行並行處理。

綜上所述,我們把經典的二八原則[2]移植到性能優化上來看,如圖1-2所示,統計學認爲,20%的系統設計或程序代碼消耗了80%的系統性能。如果我們可以找到那20%的缺陷設計或者劣質代碼,那麼我們就可以較爲容易地優化、解決80%的性能問題。



[1]    一種經典的壓縮算法。於1952年問世,迄今爲止仍經久不衰,廣泛應用於各種數據壓縮技術中,且仍不失爲熵編碼中的最佳編碼方法,deflate等壓縮算法也結合了huffman算法。

[2]    即巴萊多定律,是19世紀末20世紀初意大利經濟學家巴萊多發現的。他認爲,在任何一組東西中,最重要的只佔其中一小部分,約20%,其餘80%儘管是多數,卻是次要的,因此又稱二八定律。列舉幾點常見的性能優化策略。

n 用空間換時間。該策略屬於系統架構層面的優化。我們知道,各種緩存機制,從CPU L1/L2/RAM到硬盤,都可以通過空間換時間的策略。這類策略基本上是通過採用把計算的過程一步一步地保存或者緩存等方式,避免重複計算的發生。具體的方式可以採用數據緩衝、CDN等。類似的策略還表現爲諸如冗餘數據,比如數據鏡像、負載均衡等。

n 用時間換空間。該策略也屬於系統架構層面的優化。有時候使用少量的空間,可能性能會更好。比如網絡傳輸,如果有一些壓縮數據的算法,例如Huffman編碼壓縮算法[1],該算法本身運行過程其實很耗時,但是因爲整體來看性能瓶頸在網絡傳輸部分,所以用時間來換空間反而能省時間。

n 簡化代碼。該策略屬於基礎技術層面的優化。最高效的程序就是不執行任何代碼的程序,所以,大多數情況下我們可以認爲代碼越少性能就越高。關於代碼級優化的技術,大學的教科書中有很多示例了。比如,減少循環的層數、減少遞歸、在循環中少聲明變量、少做分配和釋放內存的操作、儘量把循環體內的表達式抽到循環外、條件表達式中的多個條件判斷的次序、儘量在程序啓動時把一些東西準備好、注意函數調用的開銷(棧上開銷)、注意面嚮對象語言中臨時對象的開銷、小心使用異常(不要用異常來檢查一些可接受可忽略並經常發生的錯誤),等。這類知識需要我們非常瞭解編程語言和常用的語言自帶資源庫。從根本上來講,不一定越少的代碼越好,我們需要了解Java本地庫的實現原理,例如同步問題,如果單純採用同步鎖(Synchronized)的方式,代碼確實很少,但是實際的性能並不好,當大量線程同時訪問代碼塊時,它會生成大量的鎖,導致系統內部代碼塊互相等待,具體我們會在第5章詳細介紹。所以,我們還是要有一定技術基礎之後才能做到代碼上的簡化。

n 並行處理。該策略屬於一種綜合性策略。試想,如果CPU只有一個核,你要是還採用多進程、多線程的方式編寫代碼,那麼計算密集型需求的應用程序反而會更慢,這是由巨大的操作系統調度和切換開銷所導致的,這類型優化策略只能依靠多核CPU才能真正體現出多進程多線程的優勢。實際應用過程中,我們會針對不同CPU進行大量高併發、密集型任務測試,不一定核數多就一定是最佳選擇,也有些情況需要單核能力強的CPU,然後採用資源隔離技術對CPU核上的計算資源進行切分,把應用程序線程部署到不同的隔離區域,這樣可以保證更多的並行程序同步進行,這也與整個系統的架構、內存共享策略、任務調度機制等多方面因素相關聯。並行處理需要我們的程序擁有擴展性,不能水平或垂直擴展的程序無法進行並行處理。

綜上所述,我們把經典的二八原則[2]移植到性能優化上來看,如圖1-2所示,統計學認爲,20%的系統設計或程序代碼消耗了80%的系統性能。如果我們可以找到那20%的缺陷設計或者劣質代碼,那麼我們就可以較爲容易地優化、解決80%的性能問題。



[1]    一種經典的壓縮算法。於1952年問世,迄今爲止仍經久不衰,廣泛應用於各種數據壓縮技術中,且仍不失爲熵編碼中的最佳編碼方法,deflate等壓縮算法也結合了huffman算法。

[2]    即巴萊多定律,是19世紀末20世紀初意大利經濟學家巴萊多發現的。他認爲,在任何一組東西中,最重要的只佔其中一小部分,約20%,其餘80%儘管是多數,卻是次要的,因此又稱二八定律。




歡迎關注麥克叔叔每晚十點說,讓我們一起交流與學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章