众所周知, 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/