眾所周知, Java在從XML文件中裝載內容到內存過程中,不論用何種方式,IO操作的開銷都無可避免。本文嘗試比較dom4j中的XPP3和SAX兩種方式裝載XML文件的性能,以便將IO操作的開銷降到最小!
package gz.lwm;
import java.io.File;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XPP3Reader;
public class TestDom4j {
private static final Logger log = Logger.getLogger(TestDom4j.class);
private static long bt;
public static void main(String[] args) {
Document doc = DocumentHelper.createDocument();
//先運行getXmlSAX()
bt = System.currentTimeMillis();
String strXml = getXmlSAX("xml/test.xml");
if(log.isDebugEnabled()){
log.debug("\ngetXmlSAX() use time: " + (System.currentTimeMillis() - bt) + " millis\n");
}
//再運行getXmlXPP3()
bt = System.currentTimeMillis();
String s1 =getXmlXPP3("xml/test.xml");
if(log.isDebugEnabled()){
log.debug("\ngetXmlXPP3() use time: " + (System.currentTimeMillis() - bt) + " millis\n");
}
}
public static String getXmlSAX(String xmlFile){
String result = "";
try {
SAXReader reader = new SAXReader();
Document document = reader.read(new File(xmlFile));
result = document.asXML();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
public static String getXmlXPP3(String xmlFile){
String result = "";
try {
XPP3Reader reader = new XPP3Reader();
Document document = reader.read(new File(xmlFile));
result = document.asXML();
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
}
有沒有這一句"Document doc = DocumentHelper.createDocument()",對性能的影響很大,特別是對大xml文件(盡管并沒有使用doc)
另外, getXmlXSAX()和getXmlXPP3()運行的先后次序對性能的影響也很大!
測試:
在我的機器上,對一個100k左右的XML文件進行多次測試后的均值結果為:
getXmlXPP3() use time: 265 millis
...
getXmlXSAX() use time: 359 millis
...
結論:
通過比較,在讀取XML文件上,XPP3略為優于SAX!
注意:
要運行例子,classpath需包含:
dom4j-1.6.1.jar
jaxen-1.1-beta-10.jar
log4j-1.2.9.jar
pull-parser-2.1.10.jar
xpp3-1.1.4c.jar
參考:
dom4j : http://www.dom4j.org/
XPP : http://www.extreme.indiana.edu/xgws/xsoap/xpp/