影響軟件性能的要素有很多,在需求階段就應該對軟件性能進行分析,在設計階段要充分考慮軟件架構設計對性能的影響,在測試階段要充分驗證軟件的性能表現是否滿足需求。
一、需求階段的性能分析
從業務角度分析,如果一個系統上線后使用人數比較多,而且后期數據量比較大(如電信、金融證券等對外開放的系統),就有必要做好性能測試,因為這些系統對于實時性交互要求比較高,對系統的響應時間、并發用戶數等要求都比較高,并且從數據角度分析,系統上線幾年后存量數據一般都是千萬級數據量,因此前期性能設計與驗證對業務系統的后期正常運行維護至關重要。
在軟件開發前期的需求分析階段,需求分析師與客戶業務人員溝通時,要明確提出各項性能指標,包括系統業務交易的使用頻度、系統并發用戶量、業務數據量評估等各項指標。然后對系統的響應時間、用戶數和資源使用進行分析。
1、響應時間分析
響應時間的需求調研分析,例如查詢類的交易需要在多少秒之內響應,對于URL連接或者刷新整個網頁的時間,它是一個非常重要的度量值,因為它是直接體現用戶體驗的一個指數。
它同時也是最不容易測量的度量值,因為它比其他的度量值更容易發生變化。我們需要了解響應時間的區域分布。例如:一般月底是發工資的時候,查詢當前賬戶額度是用戶這段時間最常用的功能,這段時間的系統響應時間估計比平常響應時間慢些,而對于電信之類的報表查詢,省內公司查詢當月本省各個分公司、分點的銷售額情況,總公司查詢全國各省的總銷售額情況,這時數量級別相差甚大,查詢時響應時間也相對比較慢。這些情況對于指導服務器分布、負載均衡、數據庫的設計都非常重要。
2、用戶數分析
用戶數分析,主要分析評估系統上線后的總用戶數、平均每天在線用戶數等情況,具體可分析:哪些交易每天都有用戶在執行業務交易,這些用戶一般占系統總人數的比例是多少;哪些交易會在月底、季末或者年底高頻率并發使用;哪些交易用戶使用得比較少,但卻是相關重要人物(如上級領導)重點關注的交易。這些用戶數分析結果,可為后續的性能測試設計中,針對混合場景的用戶數配比設計提供有力的參考依據。
3、資源使用分析
資源使用分析用于衡量系統資源使用率的情況,反映系統的最底層性能情況,對于容量規劃比較有指導作用,同時它也是比較容易理解的性能度量值。
二、設計開發階段的性能分析與驗證
大部分項目的性能問題是設計出來的,而不是開發和測試出來的。要獲得性能良好的軟件系統,需要根據需求分析及設計規劃,進行系統的規模分析和完整的性能分析,預估性能瓶頸點,提出解決方案,最后通過架構師、程序設計人員等角色進行評審驗證并確認,保障性能目標的達成。
在代碼開發階段,需要根據設計方案,在開發過程中關注性能瓶頸點,進行相應的白盒測試,通過代碼分析和評審等手段,確認性能瓶頸并解決。需要不斷地分析和總結性能問題和解決方案,形成性能方面的代碼編寫規范,從而在研發階段的早期就能確保把軟件系統在性能方面的風險降到最低。
系統設計與代碼實現的很多細節都會對軟件系統性能起到關鍵的作用。例如,在數據查詢界面設計時,需要考慮查詢方式是模糊查詢還是精確查詢、如何設計查詢分頁展現、對象的創建以及釋放問題等。
在采用具體實現技術時,也需要注意性能細節,例如 Hibernate 中對大數據量查詢時,需慎用 list() 或者 iterator() 遍歷返回查詢結果。
在采用Java等托管語言開發軟件系統時,需要注意對象的生成和對象大小問題,否則容易導致產生大量對象實例,系統不僅要花時間生成對象,還可能要花時間對這些對象進行垃圾回收和處理,生成過多的對象將會對程序的性能帶來很大的影響。
在數據庫設計上也有很多細節會對后期系統性能表現有決定性的影響,例如:對歷史查詢是否分區、如何分區性能更好;如何設計批量數據抽取轉換的方式,以保證減少或消除等待;如何設計索引,減少全表掃描、提高SQL查詢效率;編寫良好的SQL語句以便提高重用率、減少數據庫解析。
三、統測試階段的性能驗證與優化
性能問題越早發現、修改,越能保證系統上線后的穩定性,因此應該在軟件生命周期的不同階段進行軟件性能測試。
性能測試大致可以分為單元性能測試、集成性能測試、系統性能測試、多套系統互聯接口性能測試等。其中,對一套系統進行的系統性能測試,也就是在特定的環境下、一定量的數據情況下,進行的系統級的性能測試,是最常用的,也是最為測試人員所熟悉的一種性能測試。
系統性能測試階段的一般測試過程如下:在系統功能被確認后,模擬真實生產環境進行軟件系統的部署(包括硬件設備、操作系統、網絡搭建、負載均衡部署、中間件部署、數據庫部署等),然后再根據前期的性能測試需求分析結果及測試策略定義的方法,模擬一定量的虛擬并發用戶數,進行壓力測試,同時監控分析系統是否滿足預期的性能指標,識別性能可能出現的瓶頸點(應用代碼、網絡設備、硬件設備、操作系統、中間件配置、數據庫等),并進行性能優化處理,調優后再進行復測,確保軟件系統最終達到性能要求。