軟件性能的設計(三)數據類型對軟件性能的影響

                 軟件性能的設計(三)數據類型對軟件性能的影響
     劉彥清·yesky


  BadRegExpMatcher要求MailBot將輸入文本由字符數組轉換爲一個String對象,從而導致了不必要的對象創建。然而,滑稽的是爲了更方便地使用輸入文本,BadRegExpMatcher會立即將String對象轉換爲一個字符數組,這樣不但會生成另一個對象,還意味着你在費了九牛二虎之力得到的結果,跟調用程序最初提供的數據沒有什麼二樣,MailBot和BadRegExpMatcher都不要求使用String對象,String對象似乎僅僅是爲也在組件之間交換文本數據而存在的。

  在上面的BadRegExpMatcher例子中,String僅僅是一種供交換用的類型,無論是調用程序還是被調用程序都不需要使用供交換用的數據類型來表示數據,但它們可以很方便地把它與其他的數據類型進行轉換。儘管在定義接口時採用供交換用的數據類型可以在保持靈活性的前提下降低複雜性,但有時會帶來性能上的損失。

  供交換用數據類型的一個最常見的例子是JDBC ResultSet接口,沒有一種數據庫的接口會用JDBC ResultSet表示返回的結果,但JDBC驅動程序可以很方便地把數據庫返回的結果轉換爲JDBC ResultSet型數據。同樣,也沒有一種客戶端軟件用DBC ResultSet型數據表示數據記錄,但你也可以不費什麼勁兒就將ResultSet型數據轉換爲所需要的數據類型。在JDBC中我們可以接受這種"多此一舉",因爲它具有標準性和跨數據庫的可移植性等好處。無論如何,由供交換用數據類型所帶來的性能損失都是一個值得注意的問題。

  在RegExpMatcher中,在定義接口時使用String對象對減少複雜性或增加可移植性的幫助並不大,對性能卻有着相當大的影響,這麼做是得不償失的。在設計接口時使用可互換類型往往很有吸引力,因爲這樣能夠使接口看起來更"乾淨"一些,但你應該確信你爲此所作的折衷是明智的。有時━━就象RegExpMatcher那樣,調用程序可以使用多種輸入、輸出格式,應該考慮如何能夠更方便地滿足它們的需求。

  值得指出的是,對使用可互換類型對性能的影響進行量化不是一件容易的事兒。如果對調用BadRegExpMatcher的代碼進行分析,它將指派運行時間庫創建輸入用的String對象,這個String對象是爲滿足BadRegExpMatcher的需求而生成的。如果要衡量一個組件對性能的真正影響,不僅需要評估代碼的資源利用情況,還需要評估建立調用的代碼以及調用返回的代碼的資源利用情況,要使用標準的分析工具完成這些分析工作是非常困難的。

 

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