星期六, 12月 02, 2006

Eclipse TPTP 備忘記

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


沒有留言: