C++應用程序性能優化(一)——應用程序性能優化簡介

C++應用程序性能優化(一)——應用程序性能優化簡介

1、程序性能優化簡介

一、程序性能優化簡介

在計算機發展的早期階段,硬件資源相對而言是很是昂貴的,CPU運行時間與內存容量給程序開發人員設置了極大限制。所以,早期的程序對運行性能和內存空間佔用的要求是很是嚴格的,不少開發人員爲了減小1%的CPU運行時間,爲減小几十個甚至幾個字節而不懈努力。隨着計算機技術的快速發展,硬件資源變得相對便宜。但若是認爲軟件開發時,程序的性能優化再也不重要,硬件將解決性能問題也是片面的。計算機硬件的發展解決了部分軟件的性能問題,但隨着硬件計算能力的提升,用戶對軟件功能的要求也愈來愈高,軟件功能也變得愈來愈複雜,給用戶的界面和操做體驗也愈來愈智能和友好。但複雜的用戶需求帶來軟件性能上的要求是硬件不能徹底解決的。衆多實際項目經驗證實,若是在開發軟件時不重視性能優化,最終實現了軟件的功能要求,但軟件的運行效率低下,最終也不能給用戶帶來很好的效益。但另外一方面,計算機硬件愈來愈便宜,而優秀的軟件開發工程師則愈來愈昂貴,在軟件開發過程當中無限制的性能優化一樣會致使軟件開發過程當中人力成本的大幅增長。所以,軟件開發過程當中的性能優化必須在便宜的計算機硬件和昂貴的優秀工程師之間找到一個平衡點。ios

二、程序性能優化的流程

應用程序性能優化的流程以下:
C++應用程序性能優化(一)——應用程序性能優化簡介
(1)性能測量,對於規模較大、較爲複雜的軟件系統,測量性能數據是進行性能優化的基礎。只有獲取真實的數據才能分析數據找出系統的性能瓶頸。
(2)分析數據,找到系統的性能瓶頸。性能瓶頸必須創建在客觀真實的性能數據基礎上,不能是主觀臆測的。
(3)分析緣由,修改程序,是程序性能優化的核心。程序的性能包括啓動速度、運行速度、運行時佔用內存等。影響程序性能的因素主要分爲兩類:
(1)軟件編程設計因素:算法和數據結構的選擇,編程語言的使用。
(2)軟件系統結構因素:動態庫、靜態庫的組織,外部數據的存儲以及網絡環境等。
軟件編程設計因素是對軟件性能影響較大的因素,只有對算法、數據結構、編程語言有深刻的瞭解才能分析出緣由,而且找到解決性能問題的方法。
軟件系統結構因素一般與操做系統緊密相關。對於現代軟件,因爲功能複雜,一般採用組件形式,以最大限度的提升可複用性。所以,通常會包含一些動態庫、靜態庫,庫文件的組織也會影響到軟件系統的性能。算法

2、程序性能的定義

一、性能指標定義

應用程序的性能指標一般是多維的,好比響應時間、併發量等。對於桌面應用程序,其服務對象一般爲終端用戶。所以,桌面應用程序最重要的性能指標是響應時間,即針對某一個具體的操做,用戶從發出命令到應用程序完成任務並響應用戶的時間,響應時間越短越好。
除了響應時間,內存使用也是桌面應用程序的重要指標之一。內存使用包括進程工做集(任務管理器看到的內存使用)和虛擬內存使用兩個指標,越小越好。若是一個應用程序佔用內存太高,會影響其它正在運行的應用程序的響應時間。
根據可用性設計,桌面應用程序的設計原則以下:
(1)小於0.1秒的響應時間,用戶感受是即時的。
(2)小於1秒的響應時間,用戶感受是可接受的。
(3)大於1秒的操做應該有一個簡單標示(如鼠標變成沙漏)。
(4)大於10秒的操做應該有明顯的提示(如進度條)。編程

二、性能基準

桌面應用程序的性能指標包括響應時間和內存使用,但響應時間和內存使用指標一般針對單個操做。現代軟件系統一般包括多項功能,例如一個文字處理軟件可以提供的功能不下數百種,每種功能做用在不一樣類型和大小的文檔上會表現出不一樣的性能,性能基準就是用於定義程序的整體性能的。
性能基準(Performance Benchmark)是用來衡量應用程序總體性能的一套體系,經過爲應用程序輸入預先設計好的工做負載,運行一批基準用例,運行結果能夠反映應用程序在一般狀況下的性能。所以,性能基準=基準負載+基準用例。
(1)基準負載
對於桌面應用程序,運行性能基準時須要的基準負載一般表現爲一系列基準文件。基準文件應該是具備典型大小和典型內容的文件,而基準文件選取的優劣直接影響性能基準的準確性。
對於通用文字處理軟件,主要功能是建立、打開文檔,修改並保存文檔,支持的文檔類型包括.doc,.dot,.odt,.ott,.txt,.lwp等,支持文字、圖片、文本框、表格、圖形等。設計基準文件時,從文檔類型考慮,在兼顧到主要的文檔類型又要排除相似的文檔類型;從文檔內容考慮,須要覆蓋用戶最經常使用的內容對象類型和文檔大小,具體基準文件列表以下:
C++應用程序性能優化(一)——應用程序性能優化簡介
對於同一種文檔類型,每一種文檔類型包含兩個基準文件,分別有不一樣的文檔內容。
(2)基準用例
基準用例是性能基準測試時須要執行的一系列用例。基準用例的選擇有必定原則,既要儘量全面地覆蓋應用程序的主要功能,又不能像功能測試用例那樣複雜,所以,基準用例應該是用戶平常操做常常遇到的情形。
不一樣的基準用例在性能基準中的地位並不相同,每個基準用例都須要一個權值來代表它對總體性能基準的貢獻度。權值的定義依據具體狀況各有不一樣,一個比較實用的定義公式以下:
權值=用例頻率X用例重要性
用例頻率是用戶必定時間內執行該用例的平均次數。理想的用例頻率應該經過用戶行爲數據反饋得到。例如通用文字處理軟件的用戶一天內可能會執行「打開文檔」用例5次,執行「保存文檔」的用例15次。
用例重要性是一個修正係數,反映用例沒有完成前對用戶工做的影響程度。文字處理軟件打開一個文檔時有「異步打開」的功能,即程序會首先讀入文檔的部份內容並顯示給用戶,而後在後臺繼續讀入文檔的後續內容。對於「異步打開」功能能夠定義兩個用例,「第一頁顯示」(從用戶選擇打開文檔到文檔的第一頁顯示出來的過程)和「所有讀入完畢」(從用戶選擇打開文檔到文檔的全部頁的內容已經加載完畢的過程)。「第一頁顯示」用例的重要性爲1,表示不執行完本用例,用戶不能繼續工做;「所有讀入完畢」用例的重要性爲0.5,表示本用例不會顯著影響用戶的工做,文檔在後臺加載,用戶前臺已經能夠編輯,除非用戶須要編輯的內容尚未加載出來。
文字處理程序的部分基準用例以下:
C++應用程序性能優化(一)——應用程序性能優化簡介
相同的操做步驟操做不一樣類型或不一樣內容的基準文件會造成不一樣的基準用例。緩存

三、性能基準的運行

準備好基準文件和基準用例後就能夠運行性能基準並得出基準結果。
爲了保證性能基準運行的準確性,性能基準的測試環境必須知足必定要求。例如保證固定的基準測試平臺(軟件和硬件平臺不變),儘量排除其它應用程序對目標應用層程序的影響。基準測試平臺也能夠有同時運行在多種硬件平臺上的考量:運行在4G內存和8G內存時應用程序的性能表現的差異;運行在三年前硬件配置和當前主流硬件配置的性能表現的差異。
運行基準測試的過程是在固定的基準測試環境中針對基準文件順序執行一系列基準用例並記錄下每一個用例結果的過程,執行過程分爲手動執行和自動執行,結果記錄也能夠分爲手動記錄和自動記錄。
一般手工執行和記錄是基礎,最能反映最終用戶的體驗。
自動運行和記錄是目標,能夠大幅提高工做效率,並排除人工不穩定的結果。但自動運行的腳本必須保證屢次自動運行結果的穩定,保證自動運行結果和手動運行結果的可比較。
性能基準運行的過程須要注意:
(1)每個用例須要運行屢次求平均值,如須要去除最大值、最小值,而後取平均值。
(2)多個用例執行的前後順序必須固定,不然很可貴到穩定的性能基準結果。性能優化

四、性能基準結果

性能基準運行結果的原始數據是一系列的絕對數值,能夠根據不一樣的須要生成不一樣的報告,如:
總體性能水平分值:每一個用例絕對值結合每一個用例的權值,能夠給總體性能水平打分。
性能變化趨勢圖:歷史上不一樣版本的總體性能分值曲線能夠體現出性能變化趨勢。
關鍵性能指標圖表:給用戶演示的重點用例的結果圖表。
產品性能對比圖:和其它產品的性能對比圖,包括絕對值的對比和加權後分值的對比。
文字處理程序的部分基準用例運行結果數據以下:
C++應用程序性能優化(一)——應用程序性能優化簡介
性能基準能夠反映應用程序的整體性能,定義良好的性能基準用途以下:
(1)應用程序性能的絕對指標。任何想要了解產品性能的人,不管是管理層仍是客戶,均可以經過產品性能報告瞭解產品的性能。
(2)經過比較不一樣版本的基準結果,提早發現性能降低的問題和驗證性能提高的設計結果。軟件開發過程當中一般都會進行每日構建,性能基準也能夠在每日構建的基礎上每日運行,及時發現性能問題,而不是在產品即將發佈時進行性能優化。
(3)比較不一樣廠商的相似軟件的性能。橫向的比較須要性能基準,能夠找出本身軟件產品的性能薄弱環節,集中力量進行優化。網絡

3、程序性能分析方法

一、性能分析方法簡介

擁有定義良好的性能基準後,能夠輕易發現應用程序存在的性能問題。發現性能問題後須要對性能問題進行分析,程序的性能分析過程包括:性能問題分類、查找性能瓶頸、進行性能優化。數據結構

二、性能問題分類

一個操做執行太慢,須要首先分類是IO操做密集引發的問題仍是CPU相關的計算密集型問題。正確的分類將直接影響進一步的問題分析。
區別IO相關仍是CPU相關問題的簡單方法是隔離IO影響後,看性能是否獲得改善,例如同時在機械硬盤和SSD硬盤上測試,若是性能顯著提升,則是IO相關的問題。
對於文字處理軟件,冷啓動須要10.5秒,熱啓動須要2.1秒,所以冷啓動的主要問題在IO。不管是冷啓動仍是熱啓動,應用程序都是徹底退出後再從新啓動,執行的代碼流程徹底同樣,惟一區別在於IO:冷啓動後操做系統會緩存不少動態庫的代碼頁在內存。架構

三、查找性能瓶頸

對性能問題分類後,可使用性能分析工具在代碼層次查找性能瓶頸,性能分析工具備監測工具和注入工具兩類。
監測工具以下:
perfmon,Windows工具,能夠監測全部的性能指標。
FileMon,Windows工具,監測IO操做。
ProcessExplorer,Windows工具,監測進程相關的全部操做。
sysstat,Linux工具,監測全部的性能指標。
iostat,Linux工具,監測IO操做。
vmstat,Linux工具,監測內存變化。
注入工具以下:
IBM rational quantify,Windows工具,針對C++應用程序代碼注入,能夠計算函數調用次數、時間等。
Valgrind,Linux工具,針對C++應用程序代碼注入,能夠計算函數調用次數、事件、內存分配、內存泄漏檢測等。
IBM rational purify,Windows工具,針對C++應用程序代碼注入,能夠進行內存分析。
WinDbg,Windows工具,調試工具。
GDB,Linux工具,調試工具。
Dependency walker,Windows工具,分析動態連接庫之間的動態、靜態依賴關係。
ldd,Linux工具,分析共享對象間的依賴關係。併發

四、查找性能優化機會

代碼層次的性能優化設計的改動一般侷限在有限的函數調用內,相對比較容易完成。進一步的性能提高的機會須要在設計層次進行查找。設計層面的性能分析須要性能優化者對軟件的總體架構有比較深刻的瞭解,須要具體問題具體分析。異步

4、程序性能優化方法

性能問題分析完成後,須要進行性能優化。根據性能分析結果的不一樣,優化方法也各有不一樣。

一、針對IO瓶頸的性能優化

每次IO操做大概在10ms量級,100次就須要1秒左右,所以儘可能避免沒必要要的IO操做。具體作法以下:
(1)預先順序讀文件避免隨機訪問。
(2)合併多個小文件爲單個大文件。
(3)優化動態庫文件的加載。
(4)交錯IO時間和CPU時間。

二、針對計算密集的性優化

計算密集的性能問題主要有內存分配性能、字符串操做、共享變量的互斥鎖保護等,具體優化方法以下:
(1)去除冗餘代碼。
(2)字符串操做優化。
(3)減小內存分配、釋放操做,例如使用內存池。
(4)減小沒必要要的互斥鎖操做。
(5)根據性能需求選擇數據結構。
(6)延遲工做,按需執行。
(7)減小跨進程的調用。
(8)使用高性能的函數庫。

三、C++語言特性相關的性能優化

C++語言特性相關的性能優化包括內聯函數、引用、編譯優化選項等。

四、用戶體驗的性能優化

有些設計不能真正提高性能,但讓用戶體驗到了性能提高。如:
(1)流式播放設計,用戶不須要等到視頻文件下載完成再播放,能夠邊下載邊播放。
(2)線程化設計,對於須要較長時間完成的操做,能夠設計爲非阻塞式的,用戶能夠在等待時間完成其它操做任務。

五、設計層面的性能優化

設計層面的性能優化須要根據軟件總體架構具體問題具體分析。

相關文章
相關標籤/搜索