2013-05-02 90 views
1

我正在測試DOM,SAX和StAX的效率。Java解析器測試

基本上我所做的是我使用彈簧秒錶和不同大小的XML,然後比較結果。

我還認爲我可以測量時間,而元素加載到對象和對象數組,但這與分析無關。

這裏是我的SAX

StopWatch stopWatch = new StopWatch("SAX"); 
    stopWatch.start("SAX"); 
    SAXParserFactory spf = SAXParserFactory.newInstance(); 
    spf.setValidating(false); 
    SAXParser sp = spf.newSAXParser(); 
    XMLReader parser = sp.getXMLReader(); 
    parser.setErrorHandler(new Chyby()); 
    parser.setContentHandler(new DefaultHandler()); 
    parser.parse(file); 
stopWatch.stop(); 
System.out.println(stopWatch.prettyPrint()); 

代碼爲 StAX的

int temp = 0; 
    StopWatch stopWatch = new StopWatch("StAX"); 
    stopWatch.start("StAX");  
    XMLInputFactory f = XMLInputFactory.newInstance(); 
    XMLStreamReader r = f.createXMLStreamReader(new FileInputStream(file)); 
    while (r.hasNext()==true){ 
    temp++; 
    r.next(); 
    } 
    System.out.println("parsed"); 
    stopWatch.stop(); 
System.out.println(stopWatch.prettyPrint()); 

DOM

StopWatch stopWatch = new StopWatch("DOM"); 
stopWatch.start("DOM"); 
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder builder = factory.newDocumentBuilder(); 
Document document = builder.parse(subor); 
System.out.println("parsed"); 
System.out.println("----------------\n"); 
    stopWatch.stop(); 
System.out.println(stopWatch.prettyPrint()); 

我的問題是:我這樣做對嗎?還有其他的方法來測試解析器嗎? 謝謝

回答

1

您可能想要將工廠的創建從性能運行中分解出來或單獨測量它們。你可能會想要觸摸所有的數據,以防止解析器錯誤地看起來很好,懶洋洋地構建對象。

+0

我不明白第二個感嘆號。我應該用建築物來衡量嗎? :) – ivanz 2013-05-02 00:41:59

+0

@sevdah - 通過觸摸所有數據我的意思是將所有文本節點和屬性值作爲字符串,以確保測試儘可能均勻。例如,一個懶惰的DOM impl在解析調用時可能不會做任何事情,並且只會在樹遍歷時才構建DOM節點,使得解析調用顯得非常快。 – 2013-05-02 00:48:06

+0

這是我的第一個測試版本,但是後來我意識到我的用於獲取所有節點的代碼並不一定要「寫得很好」。另一件事是我有system.out.println中的所有文本節點,這也需要一些時間。那麼我應該如何使遍歷整個文檔,但沒有什麼可以顯示? – ivanz 2013-05-02 00:53:10

2

創建JAXP工廠類是一個非常昂貴的操作,其成本很大程度上取決於類路徑中存在的JAR。你並不是真的想要衡量這一點。

您需要注意消除Java啓動成本。在開始測量之前解析幾個文件。重複運行測量,平均結果,並檢查結果是否一致。

我會運行與不同大小的文件測試。通常,成本將是(ax + b),其中x是文檔大小。這裏的數字'b'表示「每文檔開銷」,如果文檔很小,則可能非常重要。

在DOM的情況下,可能會發生垃圾收集,可能會扭曲結果,因爲它們發生在不可預測的時間。有時建議在已知時間強制垃圾收集以獲得一致的測量結果。