Eclipse Test & Performance Tools Platform (TPTP) 為 Eclipse 基金會的開源項目.
這個項目的主要目的為在 Eclipse IDE 平台集成 性能測試, 調節, 監察 等功能.
這次備忘記是學習如何增加讀取 xml 的執行性能.
開始備忘記:
[1] 安裝 jdk 5
[2] 安裝 Eclipse 及 Eclipse TPTP
[3] 性能調節的案例實踐
[1] 安裝 jdk 5:
下載 jdk-1_5_0_07-nb-5_0-win-ml.exe
http://java.sun.com/j2se/1.5.0/download-netbeans.html
安裝至 D:\jdk1.5.0_07
新增環境變數 JAVA_HOME=D:\jdk1.5.0_07
D:\jdk1.5.0_07\bin 加入至 PATH 中
D:\jdk1.5.0_07\lib\dt.jar 及 D:\jdk1.5.0_07\lib\tools.jar 加入至 CLASSPATH 中
執行 D:\>java -version
輸出 java version "1.5.0_07" 即安裝成功.
[2] 安裝 Eclipse 及 Eclipse TPTP:
安裝 Eclipse:
下載 eclipse-SDK-3.2.1-win32.zip
http://www.eclipse.org/downloads/
http://ftp.jaist.ac.jp/pub/eclipse/eclipse/downloads/drops/R-3.2.1-200609210945/eclipse-SDK-3.2.1-win32.zip
解壓縮至 c:\eclipse_tptp
安裝 Eclipse TPTP:
點擊 c:\eclipse_tptp\eclipse.exe 執行 Eclipse
選擇 Help -> Software Updates -> Find and Install -> Search for new features to install
按 Next 後 點選 Callisto Discovery Site 後 按 Finish
然後選擇最接近的下載點安裝, 然後 隨 C and C++ Developement 外, 全部安裝.
如下圖所示
這裡下載安裝使用超過20分鐘. 最好選擇較接近的下載點.
[3] 性能調節的案例實踐:
這裡主要是參考以下網站內容:
http://www.eclipse.org/articles/Article-TPTP-Profiling-Tool/tptpProfilingArticle.html
project 下載點為:
http://www.eclipse.org/articles/Article-TPTP-Profiling-Tool/productCatalogSample.zip
解壓縮至 C:\eclipse_tptp\workspace\productsample
/******************* Product.java **************************/
package com.sample.product;
import java.io.File;
import com.sample.product.util.ProductCatalog;
public class Product {
public static void main(String[] args) {
if(args.length == 0)
{
System.out.println("enter catalog location in this form x:\\path\\Product");
return;
}
Product catalog = new Product();
catalog.readCatalogFromFolder(args[0]);
}
public void readCatalogFromFolder(String name) {
if(name == null)
{
System.out.println("invalid folder name");
return;
}
File file = new File(name);
if(!file.exists() !file.isDirectory())
{
System.out.println("invalid folder name " + name);
return;
}
ProductCatalog info = new ProductCatalog();
info.readData(name);
System.out.println(info.getContent());
}
}
/******************* Product.java **************************/
/******************* ProductCatalog.java **************************/
package com.sample.product.util;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class ProductCatalog extends DefaultHandler{
String content="";
public ProductCatalog() {
super();
}
protected void parseContent(File file)
{
try {
SAXParser parser = createParser();
InputStream is = new FileInputStream(file);
if (is == null) {
return;
}
parser.parse(is, this);
}
catch (Exception e) {
e.printStackTrace();
}
return;
}
protected SAXParser createParser() throws ParserConfigurationException, SAXException {
SAXParserFactory f = SAXParserFactory.newInstance();
f.setValidating(false);
return f.newSAXParser();
}
public void startElement(String namespaceURI, String localName, String elementName, Attributes atts) throws SAXException {
content+="\n"+elementName + ":\n";
for(int idx=0; idx<atts.getLength(); idx++)
{
content+="\t"+atts.getQName(idx) + "=" + atts.getValue(idx)+"\n";
}
}
public String getContent() {
return content;
}
public void readData(String name) {
if(name == null)
{
System.out.println("invalid folder name");
return;
}
File file = new File(name);
if(!file.exists() !file.isDirectory())
{
System.out.println("invalid folder name " + name);
return;
}
File[] files = file.listFiles();
for(int idx=0; idx<files.length; idx++)
parseContent(files[idx]);
}
}
/******************* ProductCatalog.java **************************/
下載測試檔案 xmlProductFiles.zip
http://www.eclipse.org/articles/Article-TPTP-Profiling-Tool/xmlProductFiles.zip
解壓縮至 c:\products
裡面包含 24 個 xml 檔案, 內容像下面這些:
<!---------------- apple.xml ------------------------>
<?xml version="1.0" encoding="UTF-8"?>
<content>
<product name="Apple" price="1.99" type="Golden" production="Canada"/>
</content>
<!---------------- apple.xml ------------------------>
<!---------------- corn.xml ------------------------>
<?xml version="1.0" encoding="UTF-8"?>
<content>
<product name="Corn" price="0.45" production="Chile">
</product>
</content>
<!---------------- corn.xml ------------------------>
<!---------------- potato.xml ------------------------>
<?xml version="1.0" encoding="UTF-8"?>
<content>
<product name="Potato" price="0.35" production="Ontario">
</product>
</content>
<!---------------- potato.xml ------------------------>
建立 java project 名為 productsample
File -> New -> Project -> Java Project -> Next
Project name 為 productsample
然後按 Finish
productsample project 裡只有 ProductCatalog.java 及 Product.java 兩個 class
如下圖所示:
然後右鍵點選 Product -> Profile As -> Java Application
選擇 Arguments [Tab]
program arguments: 輸入 c:\products
如下圖所示
切換至 Monitor [Tab]
選擇 Java Profiling -> Execution Time Analysis
如下圖所示
點選 Execution Time Analysis 後按 Edit Options
選擇 Collect boundary classes excluded by the filter set
Boundary class depth 輸入 3 [這是呼叫 method 的深度]
然後按 Finish
如下圖所示
然後切換至 Profiling and Logging [Perspective]
可以看到將 c:\products 裡的所有 xml 全部讀取進來.
出現如下圖所示
右鍵點擊 com.sample.product.Product -> Open With -> Execution Statistics
如下圖所示
上圖中 createParser() 的 Cumulative Time(Seconds) 為 0.268445
由於這個 method 執行時間不小, 懷疑這裡出現性能問題.
右鍵點選 createParser() -> Show Method Invocation Details
如下圖所示
上圖可看出 new SAXParser() 及 new Instance() 被呼叫 24 次.
即建立了 24 個 Instance.
估計可使用 singleton 模式將其減至只建立 1 個 Instance 以提高性能.
所以右鍵點擊 createParser() -> Open Source
如下圖所示
將 createParser() 裡建立的 Instance 改至 singleton 模式, 如下圖所示
再次 點擊 Product.java -> Profile As -> Application
下圖為改良後的結果
上圖中改良後的 createParser() 的 Cumulative Time(Seconds) 為 0.057422
這個 method 調節後足足提高了 5 倍執行時間的性能.
經過上面簡單的備忘記後, 有助於測試以下官方的教學:
http://www.eclipse.org/tptp/home/downloads/quicktour/v42/quick_tour.html
參考文檔:
http://www.eclipse.org/tptp/
http://www.eclipse.org/articles/Article-TPTP-Profiling-Tool/tptpProfilingArticle.html