關鍵字:軟件 性能 性能設計
[前言] 開發人員一般都是在軟件開發結束時才會考慮到性能管理問題。通常情況下,只有等到開發工作的尾聲才會進行性能方面的調節工作,希望以此來避免在整個開發周期都需要考慮這個問題━━在許多情況下,這個策略也許是成功的。然而,早期的設計決策會對性能調節是否成功以及是否有必要進行性能調節產生影響。如果你開發的軟件對性能非常敏感,從設計階段和開發周期的第一天起就應該考慮到性能管理的問題。
接口設計對軟件性能的影響
性能方面的問題有好多種。最容易修正的一種是,在執行一項計算任務時使用了一個性能不好的算法,例如,在對數目很多的數據進行排序時采用了起泡算法,每次使用時對一個經常使用的數據項進行計算而不是將它保存起來,這些問題一般我們都能很容易發現,而且一旦發現后,都能很方便地進行改正。然后,許多Java程序性能方面的問題都是是由一些比較深奧的、不容易修改的代碼━━程序組件的接口設計引起的。
臨時對象對軟件性能的影響
本文將對早期的設計決策如何影響應用程序的性能這個問題作了一些有益的探索。在這篇文章中,我們將討論在性能方面最常見的問題之一:臨時對象的創建。一個類的對象創建活動是在早期的設計階段就確定下來的,可能引發在后期出現的性能方面的問題。
數據類型對軟件性能的影響
本文中將討論過多地創建臨時對象的問題并提供一些成熟的技術來避免過多地創建臨時對象。臨時對象的存在時間一般都比較短暫,除了作為其他數據的容器外,沒有其他什么用途,開發人員一般用它向方法傳遞數據或從方法中返回數據
優化軟件性能的方法
在最初版本的Swing工具包中,創建過多的Point、Rectangle和Dimension對象會嚴重地影響程序的性能。盡管一次在一個Point或Rectangle對象中返回多個值似乎更有效率,但這樣作的代價要比調用多個方法高得多
接口設計對軟件性能的影響
性能方面的問題有好多種。最容易修正的一種是,在執行一項計算任務時使用了一個性能不好的算法,例如,在對數目很多的數據進行排序時采用了起泡算法,每次使用時對一個經常使用的數據項進行計算而不是將它保存起來,這些問題一般我們都能很容易發現,而且一旦發現后,都能很方便地進行改正。然而,許多Java程序性能方面的問題都是是由一些比較深奧的、不容易修改的代碼━━程序組件的接口設計引起的。
大多數的程序都是由內部人員開發的或從外部購買的組件"組裝"而成的。即使軟件不完全依賴于原有的組件,面向對象的設計過程也使得應用程序在開發時采用組件形式,因為這樣可以簡化程序的設計、開發和調試方面的工作。盡管采用組件的好處是不可否認的,我們還應該意識到組件的接口會對使用它們的程序的性能和運行狀態產生重大的影響。
也許會有讀者問,接口跟性能有什么關系?一個類的接口不但定義了類可以完成的功能,而且還定義了它的對象創建行為和使用它所需要調用的方法的順序,一個類如何定義它的構造器和方法會影響這個對象是否可以重用,是它本身的方法創建還是要求其客戶創建中間對象,客戶要使用這個類需要調用多少個方法。
所有這些因素都會影響到程序的性能。Java軟件性能管理方面的基本原理之一是:避免創建過多的對象。這并不意味著你不能創建任何對象從而不充分利用面象對象語言帶來的諸多好處,而是說在開發對性能敏感的代碼時需要對對象的創建保持謹慎。對象創建的代價相當高昂,我們應該在對性能敏感的軟件中盡量避免創建臨時或中間對象。
在處理字符的程序中,String類是引起對象創建的最大源。因為String類是不可變的,每當一個String類的對象被修改或構造時,都會創建一個新的對象。因此,一個具有性能意識的編程人員總是避免過多地使用String類對象。然而,盡管你在編程中盡量避免使用String對象,還是會經常發現使用的組件接口必須使用String對象,因此,你不可能不使用String類對象。
例子:表達式的匹配
作為一個例子,可以假設你在編寫一個名字為MailBot的郵件服務器。MailBot需要處理每個郵件頂部的MIME頭部━━例如發送日期或者發送者的郵件地址,它將通過使用一個匹配表達式的組件處理MIME頭部,以使這一處理過程會更簡單一些。它把輸入的字符放在一個字符緩沖區中,通過對緩沖區進行索引處理標題。由于MailBot將調用這一表達式匹配子程序來處理每一個標題,因此這個匹配子程序的性能將十分地重要。
我們首先來看一個性能十分低下的表達式匹配類的接口:
public class AwfulRegExpMatcher {
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/