程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 使用TPTP對Eclipse插件進行性能剖析和調優

使用TPTP對Eclipse插件進行性能剖析和調優

編輯:關於JAVA

TPTP 及其各子項目簡介

TPTP(Eclipse Test & Performance Tools Platform) 是 Eclipse 基金 會下的一個開源子項目,提供了一組基於 Eclipse 的工具,對軟件開發的各個 階段提供支持。基本已經覆蓋了從測試到運行時性能分析、運行狀態、日志分析 的全過程。從其項目首頁來看,其主要開發者來自包括 IBM 和 Intel 在內的大 公司。更重要的是,由於其開放性,使得基於其上來開發自己的工具變得非常容 易,這樣一來就極大地降低了開發 “軟件開發輔助工具”的門檻。

TPTP 項目中包含如下幾個子項目提供對軟件開發各個階段的支持:

Platform

TPTP 把其基礎架構專門做成了一個單獨的子項目,也由此可見 TPTP 的意義 不僅僅在於它提供了一些用於輔助軟件開發的工具,而是致力於提供一個平台, 以便更多的軟件開發輔助工具可以基於它來進行構建。其實事實亦如此,市面上 不少商業測試工具都是基於 TPTP 進行開發的。

該項目提供了 TPTP 中通用的數據結構、界面顯示元素、數據收集和通訊控 制機制。它提供了一系列擴展點以便下游項目可以很方便地擴展和重用這些功能 。

Testing tools

作為一個用於構建測試工具的基礎框架,該子項目提供了一組測試工具通用 的特性。例如用於實施測試、准備執行環境以及測試結果的報告和分析。除此之 外,該項目還作為對這個基礎架構的示例,提供了一個基於 JUnit 的組件測試 工具、一個 WEB 性能測試工具以及一個手工測試工具。

Tracing and Profiling Tools

該項目主要解決軟件運行時狀態分析。其重點就是數據的收集和分析報告。 基於 Java 的JVMPI 監控代理,它不僅可以對本地運行的程序進行分析,同時也 可以對運行在不同 JVM 甚至是不同機器上的應用進行監控和分析。

Monitoring Tools

按應用開發生命周期來看,該項目負責的是比較靠後的部分了,它主要負責 應用運行時期的監控以及日志分析。通過這個工具 ( 或基於該基礎架構構建的 工具 ) 可以對應用運行時的各項系統資源進行監控。並且通過其日志分析功能 對應用運行時的日志進行在線分析以達到對應用運行時的狀態進行監控的目的。

可以看到,TPTP 及其各個子項目已經基本涵蓋了應用程序開發過程的各個階 段。而作為軟件開發人員,我們更關注的是如何使用 TPTP 來對我們開發的應用 進行全面的分析,特別是性能分析以找到性能瓶頸以便對應用進行進一步的優化 。所以從軟件開發人員的角度來講,Tracing and Profiling Tools 應該是最有 用的工具了。

TPTP 的安裝

作為一組 Eclipse 插件,TPTP 的安裝與其他插件的安裝是非常類似的。下 面詳細介紹其安裝步驟以及安裝過程中的一些注意事項。

下載軟件

TPTP 目前提供基於 Windows 和 Linux 兩個平台的下載,在本文寫作時的最 新版本是 4.6.1,支持 Eclipse 的最新版本 3.5.1。需要注意的是,TPTP 的版 本與 Eclipse 的版本有比較嚴格的對應關系。你需要根據你使用的Eclipse 下 載對應版本的TPTP。另外,TPTP 還對其他組件有些依賴,在下載前請保證你的 Eclipse 環境已經滿足了 TPTP 的要求。

另外,可選擇下載包含所有子項目的完整的TPTP 軟件包,並且也可以選擇下 載單獨的軟件包。

根據前文的描述,“platform”子項目為其他全部項目的基礎,如果選擇單 獨下載所需要的軟件包,請不要忘記同時要下載安裝 Platform 包。

下載分 Runtime 和 SDK 兩種。如果你不想基於框架繼續擴充開發自己的工 具,則可以只下載 Runtime 包。

具體的下載要求和地址可參見其產品下載頁面:

http://www.eclipse.org/tptp/home/downloads/

同時,在該頁面中還有 Agent Controller 的下載,該組件使你可以使用 TPTP 對不同機器上的應用系統進行實時監控。如果被監控的應用跟 TPTP 在同 一個系統中,則可以不用單獨安裝這個組件。

另外,也可以通過 Eclipse 的Update Manager 安裝 TPTP,具體做法可參考 :

http://www.eclipse.org/tptp/home/downloads/updateManager.php

但是 TPTP 文件比較大,筆者建議還是先把文件下載下來再自己安裝,這樣 可以使安裝過程更快一點。

安裝軟件

通過 Update Manager 安裝的方式可以參考上面給出的地址,裡面有詳細的 介紹。這裡我來介紹通過下載文件進行安裝的方法。以下的步驟以下載完整 TPTP 組件包為例。

將下載到的壓縮包解壓縮至 Eclipse 的安裝目錄

注意,解壓縮後,壓縮包裡的plugins 與 features 目錄中的內容應該放入 Eclipse 安裝目錄中的相應目錄中。

或者通過其他方式安裝插件,請參考“Manage your Eclipse environment” (http://www.ibm.com/developerworks/opensource/library/os-ecl-manage/ )

用 clean 參數啟動 Eclipse

啟動 Eclipse 並加入 -clean 參數以清除之前的插件緩存

驗證 TPTP 的Tracing and Profiling Tools 已經正確安裝

當 eclipse 啟動後,如果可以打開“Profiling Monitor” view, 則說明 TPTP 以及 Tracing and Profiling Tools 已經正確安裝好了。

圖 1. 驗證 TPTP 的安裝

使用 Tracing and Profiling Tools

我們有這樣一個插件,用來從磁盤上讀取記錄產品信息的XML 文件,然後在 一個表格中將其顯示出來。這整個插件最後的表現形式就是一個 Eclipse 視圖 :

圖 2. 應用示例

我們的任務就是對這個插件的工作進行性能分析與調優。

以 profile 模式運行應用

對我們的插件進行性能分析,就要先以 profile 模式將其運行起來。MyShop 插件的源代碼可以在本文的附件中找到。

圖 3. 以 Profile 模式運行應用

插件安裝成功後,就可以在工具欄上看到以 profile 模式運行的圖標。點擊 該圖標並選擇以 Eclipse 應用的方式運行該程序。

接下來是運行配置界面,可以在這裡進行運行方式、分析規則等配置。

圖 4. Profile 模式下的運行配置

可以看到,這個運行配置窗口與普通運行窗口的不同就是多了一個 Monitor 標簽。在這裡可以設置我們要分析的方式和添加分析時的過濾器以便將我們並不 關心的類的運行情況從分析報告中過濾掉。

在分析方式上,因為我們要對性能,即程序運行的時間進行分析,所以如上 圖所示,我們選擇使用“Execution Time Analysis”分析方式。

接著選擇“Edit Options”對運行參數進行設置:

圖 5. 編輯 Profile 選項

關於過濾器

同時監控的類越多,就會致使程序的運行越慢。合理設置過濾器,僅監控自 己需要的類,不僅會讓分析報告更清晰,還可以讓整個分析過程變得更快。

在我們的配置中,選擇圖形化的數據類型以便以更直觀的方式觀察執行過程 。但是需要注意的是,選擇圖形化的數據類型需要耗費較大的系統資源,如果你 正在監控的應用比較大則不適合用這個選項,否則可能導致整個程序反應過慢。

接下來設置監控代碼的過濾器。

回到運行配置窗口,在 Java Profiling 節點上雙擊鼠標或選擇 “Edit Options”, 進入過濾器設置界面。

可以看到,已經預設好的兩個過濾器可以將一些系統的包排除在外。這裡我 們來新建一個自己的過濾器。

圖 6. 過濾器設置

點擊上面的“Add” 按鈕增加一個新的過濾器,取名為 MyShop。點擊下面的 “Add” 按鈕增加過濾規則。過濾器支持通配符。上圖中我們的過濾器規則為分 析 以“net.faquir” 開頭的包中的所有方法並忽略其他任何代碼中的任何方法 。

點擊 “Next” 按鈕進行下一步配置。因為我們需要進行性能分析的程序是 Eclipse 插件程序,在我們的視圖被調用之前進行分析數據的收集是沒有任何意 義的。所以我們可以取消“在程序啟動時自動開始監控”的選項以便到執行我們 需要進行性能分析的時候再打開這個數據收集選項以排除不必要的干擾數據。

圖 7. 設置啟動選項

完成之後選擇“Finish”回到主配置窗口,然後按“OK”以執行程序。

可以看到,此階段監控服務的狀態是暫停的:

圖 8. 監視器運行狀態

收集運行時數據

當主程序完全運行起來後,選擇我們的MyShop 視圖並將其調用起來。在我們 做下一步操作前,點擊 “開始”按鈕 ( 參見圖 8) 以開啟監視器的數據收集。

可以看到,此時 Profilling Monitor 視圖中的運行狀態已由暫停改為運行 :

圖 9. 開始數據收集

接著,進行我們的操作。選擇 “browse” 按鈕並選擇存放我們產品信息文 件的目錄。產品信息文件可在本文附件中找到。點擊 OK 後,可以看到,如圖 2 所示,產品信息已經從文件中獲取出來了。

操作完成後,我們也獲得了我們需要的數據,可以將需要分析的程序關閉, 回到前面的Profilling Monitor 視圖中進行具體的數據分析工作。

關於離線數據分析

實際上,在被分析程序運行的時候,這些數據的分析工作就可以開始進行了 。但是進行在線分析會導致被測試程序運行緩慢而且影響分析效果。所以如果可 能,最好是把數據收集下來後關閉被測試程序進行離線數據分析。

分析程序調用關系

使用 TPTP 對運行時數據進行分析,其中一個非常有用的功能就是根據運行 時數據分析對象之間的調用關系。TPTP 提供 UML 序列圖的查看方式。這種方式 的分析對剛接手一個不熟悉的程序開發時尤其有用。

回到我們的例子中,當分析程序運行後,就會在 Profilling Monitor 視圖 中生成相應的報告。如圖所示,選擇以 UML2 Class Interactions 的方式打開 分析報告。

圖 10. 以 UML2 Class Interactions 的方式打開分析報告

使用 TPTP 對 Eclipse 插件進行性能剖析和調優

在 UML 序列圖的分析中,不僅可以看到類之間的調用關系,其調用過程中的 性能瓶頸也會被標記出來。

圖 11. 以 UML 序列圖展示類之間調用關系

分析性能瓶頸

可以使用 Execution Statistics 視圖來分析程序中各個方法的運行時間。 打開該視圖的方式是,數據收集進程上點右鍵,選擇以 Execution Statistics 方式打開。

在該視圖中,顯示了所有調用到的方法及其運行時間。運行時間有多種表示 方法。最常用到的就是“cumulative time”。該時間表示了這個方法調用的總 耗時,其中包含其調用其他方法的時間。

圖 12. 運行統計視圖

我們 MyShop 插件的運行結果如上圖所示。可以看到,getProductDir 方法 耗時最長。而該方法的作用是打開一個文件選擇對話框,等待用戶的選擇,等選 擇完成後再關閉對話框。因此其時中包含了等待用戶選擇的部分。這當然應該在 我們的性能分析中排除在外。除此之外耗費時間最長的是 parseContent 方法。 該方法用於從包含產品信息的XML 文件中獲取真正的產品信息數據。雙擊該方法 查看該方法調用的詳細數據。

圖 13. 方法調用詳細數據

需要注意的是,在下面的Selected method invokes 表格中,顯示結果是通 過我們設置的過濾器過濾後的結果。在上面的結果中,我們可以看到,我們自己 的方法調用花費的時間都很小。由此可見,消耗時間更多的地方是在 XML 解析 的方法中。

解決性能問題並驗證修改

通過對上面運行數據的分析,我們的結論是,對性能影響最大的是 XML 的解 析。而根據得到的數據,24 條商品數據的獲取就已經需要 0.5s 的時間,而在 正常使用中的商品數量則會達到根本不可忍受的程度。通過對代碼的分析,我們 得知目前的XML 解析使用的是 DOM 的分析方

式,而在我們的應用中只有 XML 的讀操作而沒有寫操作。在這種方式下, SAX 的解析方式效率要更高。因此我們可以將 XML 解析部分的代碼改為 SAX 方 式。

創建 ProductSAXParser 類

創建該類實現我們的ProductParser接口並繼承自DefaultHandler 接口完成 大部分的分析邏輯。

實現 Parser 方法

實現 ProductParser 接口和 DefaultHandler 定義的方法完成解析邏輯 。

更改 XML 解析方式

在父類 ShopView中更改調用的解析器為我們新創建的SAX 實現。

具體的代碼可參考本文附件所帶的示例代碼。

修改好代碼並按照上面的步驟從新運行數據分析,可以看到,現在的性能已 經大為改觀:

圖 14. 修改代碼後的運行統計視圖

可以看到,XML 解析方法的運行時間已經由 0.5s 左右縮短到了大約 0.057s 。

進一步的性能調優

如果你恰好足夠幸運遇到了一位非常苛刻的用戶,對目前的性能水平還不夠 滿意。那我們就需要對現在的代碼進一步進行優化以提高性能。

從新進行上面的步驟,首先以所有方法的執行時間進行排序。之後按照耗時 的順序從前往後進行分析。根據對前面幾個方法的分析,我們發現,前面幾個方 法耗時較多的原因也都是因為最終調用了我們的parseContent 方法。

按照上面的步驟,點擊該方法以分析其具體執行狀況:

圖 15. 進一步分析 parseContent 方法

在該方法的Selected method incokes 部分,我們可以看到,createParser 耗費了大部分的運行時間。我們可以從兩方面入手進行性能調優,一是改善該段 代碼執行邏輯以增強性能,例如我們的第一輪修改中,從 DOM 的分析模式改為 SAX 模式。另外就是從代碼的調用次數上入手,減少性能不佳代碼的調用次數。 例如在這裡,通過進一步分析,具有性能瓶頸的方法用於產生用於 XML 分析的 解析器,邏輯非常簡單,但卻被調用了 24 次。所以我們就可以從減少次數的角 度來增強性能。

分析代碼,我們可以創建一個 SAX 解析器的私有變量以在每次解析 XML 的 過程中重用同一個解析器對象。以如下的方式修改代碼:

清單 1. 重用 SAX 解析器對象的代碼

privateSAXParser _saxParser;

  protectedSAXParser createParser()  throwsParserConfigurationException, SAXException
  {
   if(_saxParser == null)
  {
     SAXParserFactory f = SAXParserFactory.newInstance ();
     f.setValidating(false);
  _saxParser = f.newSAXParser();
  }
   return_saxParser;
  }

之後再次執行分析過程,就會發現,parseContent 方法的執行時間已經被縮 減到了 0.017s 左右。通過我們的性能分析可調優,一個完成同樣任務的方法, 其執行時間已經從 0.5s 降低到了 0.017s,相信最苛刻的客戶也可以接受這樣 的結果了吧。

本文通過一個示例說明了在 Eclipse 插件開發過程中如何使用 TPTP 進行性 能分析和調優。可以看到,使用 TPTP 可以對程序運行時的各種數據進行直觀化 、圖形化的分析。通過該工具的幫助,性能調優以及程序運行時狀態的分析其實 是一件非常容易的事情。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved