2011-01-13 48 views
0

我正在使用STAX解析器來處理xhtml中的每個文本節點。該應用程序部署在Unix框中。解析操作在執行第一個實例時需要更多時間。當我第二次運行它需要相對較少的時間,並且在隨後的調用中,比第二次運行花費的時間要少得多,其後的結果幾乎一致。以下是我正在使用的代碼。不知道爲什麼解析相同輸入的時間不一致。請幫忙。STAX解析器 - 對於相同的輸入文件,性能不一致

一次創建的XMLInputFactory的,(在類級靜態方法)

static { 
    if (xmlInputFactory == null) { 
    xmlInputFactory = XMLInputFactory.newInstance(); 
    xmlInputFactory.setProperty(javax.xml.stream.XMLInputFactory.IS_NAMESPACE_AWARE, false); 
    } 
    } 

執行不一致的 同一輸入文件給出不同的響應時間的解析代碼,

private static void parse(String xhtmlInput) throws XMLStreamException { 
    ByteArrayInputStream arrayInputStream = new ByteArrayInputStream  (xhtmlInput.getBytes(Charset.forName("UTF-8"))); 
    XMLStreamReader parser = xmlInputFactory.createXMLStreamReader(arrayInputStream); 
    while (true) { 
    int currentEvent = parser.next(); 
    if (currentEvent == XMLStreamConstants.CHARACTERS) { 
     // Do operation 
    } else if (currentEvent == XMLStreamConstants.END_DOCUMENT) { 
    parser.close(); 
    break; 
    } 
    } 
    } 
+0

哪個StAX解析器? – bmargulies 2011-01-13 18:30:25

+0

javax.xml.stream.XMLStreamReader – Rachel 2011-01-13 18:45:12

回答

3

在不知道它是哪種實現方式,這只是一點推測,但有一個常見原因是爲什麼任何Java庫或應用程序在一段時間後運行得更快:

  • JVM本身可以即時編譯字節碼,並在運行中對其進行優化。這被稱爲JIT熱身,並且發生得非常快(前10秒左右)
  • 當讀取文件時,底層操作系統通常會緩存正在讀取的磁盤塊 - 如果再次讀取相同的內容,則不會從磁盤讀取,來自內存中的磁盤緩衝區。

這也是最常見的原因天真的Java測試基準,給無用的結果:如果你不考慮兩者(即熱身了一段時間的測試,丟棄了階段性成果;並從內存中讀取,而不是磁盤測試數據),結果毫無意義。

相關問題