Show index.html syntax highlighted
<!-- saved from url=(0022)http://internet.e-mail -->
<html>
<head>
<meta http-equiv="Content-Language" content="en-us">
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
<meta name="GENERATOR" content="Microsoft FrontPage 4.0">
<meta name="ProgId" content="FrontPage.Editor.Document">
<title>Dom4J performance versus Xerces</title>
</head>
<body>
<h1><font face="Arial">Dom4J performance versus Xerces / Xalan</font></h1>
<p><font face="Arial"><a href="mailto:bhm@eigner.com">Martin Böhm</a>, <a href="mailto:jjd@eigner.com">Jean-Jacques
Dubray</a></font></p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><b>Eigner</b>
Precision Lifecycle Management</font></p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><a href="http://www.eigner.com"><font face="Arial">www.eigner.com</font></a></p>
<h2><font face="Arial">Introduction</font></h2>
<p><font face="Arial">We have created a simple test bed to evaluate the performance of DOM4J versus
Xerces/Xalan. These results are intended to give a rough idea rather than
exhaustive test suite. In particular we focus our study on XML document which
look like database result set. It is pretty clear that performance results may
vary greatly based on the topology of your XML.</font></p>
<p><font face="Arial">The test was designed with two topologies in mind: </font> </p>
<p><font face="Arial">a) to have elements only and each element name is unique in
the whole document.</font> </p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font COLOR="#008080" size="2" face="Arial"><?xml
version="1.0" encoding="UTF-8"?></font></p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font size="2" face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">ItemResultSet</font><font COLOR="#0000ff">></font></font></p>
<font SIZE="2">
<blockquote>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Item</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<blockquote>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr0x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr0x0</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr1x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr1x0</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr2x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr2x0</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr3x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr3x0</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr4x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr4x0</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr5x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr5x0</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr6x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr6x0</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr7x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr7x0</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr8x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr8x0</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr9x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr9x0</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr10x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr10x0</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr11x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr11x0</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr12x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr12x0</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr13x0</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr13x0</font><font COLOR="#0000ff">></font></font></font></p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font size="2" face="Arial">...</font></p>
</blockquote>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"></</font><font COLOR="#800000">Item</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Item</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<blockquote>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr0x1</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr0x1</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr1x1</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr1x1</font><font COLOR="#0000ff">></font></font></font></p>
<font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font COLOR="#0000ff"><</font><font COLOR="#800000">Attr2x1</font><font COLOR="#0000ff">></font>123456789<font COLOR="#0000ff"></</font><font COLOR="#800000">Attr2x1</font><font COLOR="#0000ff">></font></font></p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font color="#0000ff" face="Arial">...</font></p>
</blockquote>
</blockquote>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><font color="#0000ff"></</font><font COLOR="#800000">ItemResultSet</font><font COLOR="#0000ff">></font></font></font></p>
<p><font face="Arial">b) To use attributes only</font></p>
<font SIZE="2" COLOR="#008080">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><?xml
version="1.0" encoding="UTF-8"?></font></p>
</font><font SIZE="2" COLOR="#0000ff">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial"><</font></font><font SIZE="2" COLOR="#800000" face="Arial">ItemResultSet</font><font SIZE="2" COLOR="#0000ff"><font face="Arial">></font></p>
</font><font SIZE="2">
<blockquote>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"></font><font face="Arial"><font SIZE="2" COLOR="#0000ff"><</font><font SIZE="2" COLOR="#800000">Item</font><font SIZE="2" COLOR="#ff0000">
guid</font><font SIZE="2" COLOR="#0000ff">="</font><font SIZE="2">0</font><font SIZE="2" COLOR="#0000ff">"</font><font SIZE="2" COLOR="#ff0000">
Attr0</font><font SIZE="2" COLOR="#0000ff">="</font><font SIZE="2">123456789</font><font SIZE="2" COLOR="#0000ff">"</font><font SIZE="2" COLOR="#ff0000">
Attr1</font><font SIZE="2" COLOR="#0000ff">="</font><font SIZE="2">123456789</font><font SIZE="2" COLOR="#0000ff">"</font><font SIZE="2" COLOR="#ff0000">
</font></font><font COLOR="#0000ff" size="2"><font face="Arial">.../></font></p>
</font><font SIZE="2">
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"></font><font face="Arial"><font SIZE="2" COLOR="#0000ff"><</font><font SIZE="2" COLOR="#800000">Item</font><font SIZE="2" COLOR="#ff0000">
guid</font><font SIZE="2" COLOR="#0000ff">="</font><font SIZE="2">1</font><font SIZE="2" COLOR="#0000ff">"</font><font SIZE="2" COLOR="#ff0000">
Attr0</font><font SIZE="2" COLOR="#0000ff">="</font><font SIZE="2">123456789</font><font SIZE="2" COLOR="#0000ff">"</font><font SIZE="2" COLOR="#ff0000">
Attr1</font><font SIZE="2" COLOR="#0000ff">="</font><font SIZE="2">123456789</font><font SIZE="2" COLOR="#0000ff">"
.../></font></font></p>
</blockquote>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font SIZE="2" face="Arial"><font color="#0000ff"></</font><font COLOR="#800000">ItemResultSet</font><font COLOR="#0000ff">></font></font></p>
<p> </p>
<p> </p>
<p><font face="Arial">We have tested for 1000,100,10,1 items the time it takes to:</font></p>
<ul>
<li><font face="Arial">create a document</font></li>
<li><font face="Arial">write it to disk</font></li>
<li><font face="Arial">reparse it from disk (I don't have a good disk)</font></li>
<li><font face="Arial">transform it to some other XML format</font></li>
<li><font face="Arial">run a series of XPath statements for both selectNodes and selectSingleNode
(where applicable)</font>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">a) </font></p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial" size="2" color="#0000FF">/*/*/Attr1x1</font></p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial" size="2" color="#0000FF">/*/*/Attr1x500</font></p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial" size="2" color="#0000FF">/*/*/Attr1x999</font></p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial" size="2" color="#0000FF">/*/*/Item</font>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">b) </font>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font SIZE="2" color="#0000FF" face="Arial">/*/*[@id="1"]</font>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font SIZE="2" color="#0000FF" face="Arial">/*/*[@id="500"]</font>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font SIZE="2" color="#0000FF" face="Arial">/*/*[@id="999""]</font></li>
</ul>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">All
tests are running on my lapdog (PIII, 500MHz, 512Mb) We allocate a heap size of
256 Mb when we start the test.</font></p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"> </p>
<h2 style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">Results</font></h2>
<h3 style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">case
a), comparison between Dom4j/Jaxen versus Xerces/Xalan</font></h3>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="10%"><font face="Arial">All times in ms</font></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%" bordercolor="#000000"></td>
<td width="20%" colspan="2" bordercolor="#000000"><b><font face="Arial">Create Document</font> </b></td>
<td width="20%" colspan="2" bordercolor="#000000"><b><font face="Arial">Write Document to disk</font></b></td>
<td width="20%" colspan="2" bordercolor="#000000"><b><font face="Arial">Reparse the document
from disk</font></b></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%" bordercolor="#000000"><b><font face="Arial">Items</font></b></td>
<td width="10%" bordercolor="#000000"><i><font face="Arial">dom4j</font></i></td>
<td width="10%" bordercolor="#000000"><i><font face="Arial">xalan</font></i></td>
<td width="10%" bordercolor="#000000"><i><font face="Arial">dom4j</font></i></td>
<td width="10%" bordercolor="#000000"><i><font face="Arial">xalan</font></i></td>
<td width="10%" bordercolor="#000000"><i><font face="Arial">dom4j</font></i></td>
<td width="10%" bordercolor="#000000"><i><font face="Arial">xalan</font></i></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%" bordercolor="#000000"><b><font face="Arial">1000</font></b></td>
<td width="10%" bordercolor="#000000"><font face="Arial">641.0</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">571.0</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">531</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">852</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">2020</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">2664</font></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%" bordercolor="#000000"><b><font face="Arial">100</font></b></td>
<td width="10%" bordercolor="#000000"><font face="Arial">9.0</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">20.0</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">60</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">61</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">62.99</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">68.6</font></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%" bordercolor="#000000"><b><font face="Arial">10</font></b></td>
<td width="10%" bordercolor="#000000"><font face="Arial">0.7</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">1.0</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">10</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">10</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">11.92</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">14.62</font></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%" bordercolor="#000000"><b><font face="Arial">1</font></b></td>
<td width="10%" bordercolor="#000000"><font face="Arial">0.1</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">0.0</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">10</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">10</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">8.01</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">8.31</font></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
</table>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"> </p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">The
most surprising result comes from executing XPath statements. Xalan does warn us
in the <a href="http://xml.apache.org/xalan-j/apidocs/org/apache/xpath/XPathAPI.html">JavaDoc</a>
that things could be a little slow.</font></p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">selectSingleNode()</font></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="50%">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="33%"><font face="Arial">All times in ms</font></td>
<td width="33%"><b><font face="Arial">1000 Items in the document</font></b></td>
<td width="34%"></td>
</tr>
<tr>
<td width="33%"></td>
<td width="33%"><i><font face="Arial">dom4j</font></i></td>
<td width="34%"><i><font face="Arial">Xalan</font></i></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x1</font></b></td>
<td width="33%"><font face="Arial">127</font></td>
<td width="34%"><font face="Arial">10</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x500</font></b></td>
<td width="33%"><font face="Arial">20</font></td>
<td width="34%"><font face="Arial">661</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x999</font></b></td>
<td width="33%"><font face="Arial">23</font></td>
<td width="34%"><font face="Arial">1662</font></td>
</tr>
<tr>
<td width="33%"></td>
<td width="33%"></td>
<td width="34%"></td>
</tr>
</table>
</td>
<td width="50%">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="33%"></td>
<td width="33%"><b><font face="Arial">100 Items in the document</font></b></td>
<td width="34%"></td>
</tr>
<tr>
<td width="33%"></td>
<td width="33%"><i><font face="Arial">dom4j </font></i></td>
<td width="34%"><i><font face="Arial">Xalan</font></i></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x1</font></b></td>
<td width="33%"><font face="Arial">2</font></td>
<td width="34%"><font face="Arial">3.0</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x50</font></b></td>
<td width="33%"><font face="Arial">3</font></td>
<td width="34%"><font face="Arial">13.0</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x99</font></b></td>
<td width="33%"><font face="Arial">2</font></td>
<td width="34%"><font face="Arial">55.1</font></td>
</tr>
<tr>
<td width="33%"></td>
<td width="33%"></td>
<td width="34%"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td width="50%"></td>
<td width="50%"></td>
</tr>
</table>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"> </p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">selectNodes()</font></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="50%">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="33%"><font face="Arial">All times in ms</font></td>
<td width="33%"><b><font face="Arial">1000 Items in the document</font></b></td>
<td width="34%"></td>
</tr>
<tr>
<td width="33%"></td>
<td width="33%"><i><font face="Arial">dom4j</font></i></td>
<td width="34%"><i><font face="Arial">Xalan</font></i></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x1</font></b></td>
<td width="33%"><font face="Arial">16.6</font></td>
<td width="34%"><font face="Arial">1633</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x500</font></b></td>
<td width="33%"><font face="Arial">20</font></td>
<td width="34%"><font face="Arial">1772</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x999</font></b></td>
<td width="33%"><font face="Arial">20.0</font></td>
<td width="34%"><font face="Arial">1733</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/Item</font></b></td>
<td width="33%"><font face="Arial">2.0</font></td>
<td width="34%"><font face="Arial">1742</font></td>
</tr>
</table>
</td>
<td width="50%">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="33%"></td>
<td width="33%"><b><font face="Arial">100 Items in the document</font></b></td>
<td width="34%"></td>
</tr>
<tr>
<td width="33%"></td>
<td width="33%"><i><font face="Arial">dom4j</font></i></td>
<td width="34%"><i><font face="Arial">Xalan</font></i></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x1</font></b></td>
<td width="33%"><font face="Arial">1.0</font></td>
<td width="34%"><font face="Arial">35.0</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x50</font></b></td>
<td width="33%"><font face="Arial">2.0</font></td>
<td width="34%"><font face="Arial">36.1</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x99</font></b></td>
<td width="33%"><font face="Arial">1.0</font></td>
<td width="34%"><font face="Arial">49.0</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/Item</font></b></td>
<td width="33%"><font face="Arial">0.2</font></td>
<td width="34%"><font face="Arial">49.0</font></td>
</tr>
</table>
</td>
</tr>
<tr>
<td width="50%"></td>
<td width="50%"></td>
</tr>
</table>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"> </p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">selectNodes()</font></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="50%">
<table border="0" cellpadding="0" cellspacing="0" width="100%" height="123">
<tr>
<td width="33%" height="21"><font face="Arial">All times in ms</font></td>
<td width="33%" height="21"><b><font face="Arial">/*/*/Attr1x500</font></b></td>
<td width="34%" height="21"></td>
</tr>
<tr>
<td width="33%" height="21"></td>
<td width="33%" height="21"><i><font face="Arial">dom4j </font></i></td>
<td width="34%" height="21"><i><font face="Arial">Xalan</font></i></td>
</tr>
<tr>
<td width="33%" height="18"><b><font face="Arial">1000</font></b></td>
<td width="33%" height="18"><font face="Arial">20.0</font></td>
<td width="34%" height="18"><font face="Arial">1793</font></td>
</tr>
<tr>
<td width="33%" height="21"><b><font face="Arial">100</font></b></td>
<td width="33%" height="21"><font face="Arial">2.0</font></td>
<td width="34%" height="21"><font face="Arial">36.1</font></td>
</tr>
<tr>
<td width="33%" height="21"><b><font face="Arial">10</font></b></td>
<td width="33%" height="21"><font face="Arial">0.1</font></td>
<td width="34%" height="21"><font face="Arial">11.72</font></td>
</tr>
<tr>
<td width="33%" height="21"><b><font face="Arial">1</font></b></td>
<td width="33%" height="21"><font face="Arial">0.1</font></td>
<td width="34%" height="21"><font face="Arial">4.3</font></td>
</tr>
</table>
</td>
<td width="50%"></td>
</tr>
<tr>
<td width="50%"></td>
</tr>
</table>
<h2> </h2>
<h3 style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">case
b), we use Dom4j/Jaxen and compare how it behaves with a document that contains
only element elements versus document that model the same data as attribute
attributes</font></h3>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="10%"><font face="Arial">All times in ms</font></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%" bordercolor="#000000"></td>
<td width="20%" colspan="2" bordercolor="#000000"><b><font face="Arial">Create Document</font> </b></td>
<td width="20%" colspan="2" bordercolor="#000000"><b><font face="Arial">Write Document to disk</font></b></td>
<td width="20%" colspan="2" bordercolor="#000000"><b><font face="Arial">Reparse the document
from disk</font></b></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%" bordercolor="#000000"><b><font face="Arial">Items</font></b></td>
<td width="10%" bordercolor="#000000"><i><font face="Arial">dom4j - elements</font></i></td>
<td width="10%" bordercolor="#000000"><i><font face="Arial">dom4j - attrs</font></i></td>
<td width="10%" bordercolor="#000000"><i><font face="Arial">dom4j - elements</font></i></td>
<td width="10%" bordercolor="#000000"><i><font face="Arial">dom4j - attrs</font></i></td>
<td width="10%" bordercolor="#000000"><i><font face="Arial">dom4j - elements</font></i></td>
<td width="10%" bordercolor="#000000"><i><font face="Arial">dom4j - attrs</font></i></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%" bordercolor="#000000"><b><font face="Arial">1000</font></b></td>
<td width="10%" bordercolor="#000000"><font face="Arial">641.0</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">100</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">531</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">140</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">2020</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">207</font></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%" bordercolor="#000000"><b><font face="Arial">100</font></b></td>
<td width="10%" bordercolor="#000000"><font face="Arial">9.0</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">8.0</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">60</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">20</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">62.99</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">24</font></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%" bordercolor="#000000"><b><font face="Arial">10</font></b></td>
<td width="10%" bordercolor="#000000"><font face="Arial">0.7</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">0.9</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">10</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">10</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">11.92</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">8.31</font></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%" bordercolor="#000000"><b><font face="Arial">1</font></b></td>
<td width="10%" bordercolor="#000000"><font face="Arial">0.1</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">0.1</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">10</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">10</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">8.01</font></td>
<td width="10%" bordercolor="#000000"><font face="Arial">6.81</font></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
<tr>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
<td width="10%"></td>
</tr>
</table>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"> </p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">The
most surprising result comes from executing XPath statements. Xalan does warn us
in the <a href="http://xml.apache.org/xalan-j/apidocs/org/apache/xpath/XPathAPI.html">JavaDoc</a>
that things could be a little slow.</font></p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">selectSingleNode()</font></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="50%">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="33%"><font face="Arial">All times in ms</font></td>
<td width="33%"><b><font face="Arial">1000 Items in the document</font></b></td>
<td width="34%"></td>
</tr>
<tr>
<td width="33%"></td>
<td width="33%"><i><font face="Arial">Dom4j - elements</font></i></td>
<td width="34%"><i><font face="Arial">dom4j - attrs</font></i></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x1</font></b></td>
<td width="33%"><font face="Arial">127</font></td>
<td width="34%"><font face="Arial">36</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x500</font></b></td>
<td width="33%"><font face="Arial">20</font></td>
<td width="34%"><font face="Arial">33</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x999</font></b></td>
<td width="33%"><font face="Arial">23</font></td>
<td width="34%"><font face="Arial">37</font></td>
</tr>
<tr>
<td width="33%"></td>
<td width="33%"></td>
<td width="34%"></td>
</tr>
</table>
</td>
<td width="50%">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="33%"></td>
<td width="33%"><b><font face="Arial">100 Items in the document</font></b></td>
<td width="34%"></td>
</tr>
<tr>
<td width="33%"></td>
<td width="33%"><i><font face="Arial">Dom4j - elements</font></i></td>
<td width="34%"><i><font face="Arial">dom4j - attrs</font></i></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x1</font></b></td>
<td width="33%"><font face="Arial">2</font></td>
<td width="34%"><font face="Arial">4</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x50</font></b></td>
<td width="33%"><font face="Arial">3</font></td>
<td width="34%"><font face="Arial">4</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x99</font></b></td>
<td width="33%"><font face="Arial">2</font></td>
<td width="34%"><font face="Arial">4</font></td>
</tr>
<tr>
<td width="33%"></td>
<td width="33%"></td>
<td width="34%"></td>
</tr>
</table>
</td>
</tr>
<tr>
<td width="50%"></td>
<td width="50%"></td>
</tr>
</table>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"> </p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">selectNodes()</font></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="50%">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="33%"><font face="Arial">All times in ms</font></td>
<td width="33%"><b><font face="Arial">1000 Items in the document</font></b></td>
<td width="34%"></td>
</tr>
<tr>
<td width="33%"></td>
<td width="33%"><i><font face="Arial">dom4j - elements</font></i></td>
<td width="34%"><i><font face="Arial">dom4j - attrs</font></i></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x1</font></b></td>
<td width="33%"><font face="Arial">16.6</font></td>
<td width="34%"><font face="Arial">36.6</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x500</font></b></td>
<td width="33%"><font face="Arial">20</font></td>
<td width="34%"><font face="Arial">36.6</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x999</font></b></td>
<td width="33%"><font face="Arial">20.0</font></td>
<td width="34%"><font face="Arial">36.6</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/Item</font></b></td>
<td width="33%"><font face="Arial">2.0</font></td>
<td width="34%"><font face="Arial">1.7</font></td>
</tr>
</table>
</td>
<td width="50%">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="33%"></td>
<td width="33%"><b><font face="Arial">100 Items in the document</font></b></td>
<td width="34%"></td>
</tr>
<tr>
<td width="33%"></td>
<td width="33%"><i><font face="Arial">Dom4j - elements</font></i></td>
<td width="34%"><i><font face="Arial">dom4j - attrs</font></i></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x1</font></b></td>
<td width="33%"><font face="Arial">1.0</font></td>
<td width="34%"><font face="Arial">3.0</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x50</font></b></td>
<td width="33%"><font face="Arial">2.0</font></td>
<td width="34%"><font face="Arial">4.1</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/*/Attr1x99</font></b></td>
<td width="33%"><font face="Arial">1.0</font></td>
<td width="34%"><font face="Arial">4</font></td>
</tr>
<tr>
<td width="33%"><b><font face="Arial">/*/Item</font></b></td>
<td width="33%"><font face="Arial">0.2</font></td>
<td width="34%"><font face="Arial">0.2</font></td>
</tr>
</table>
</td>
</tr>
<tr>
<td width="50%"></td>
<td width="50%"></td>
</tr>
</table>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"> </p>
<p style="word-spacing: 0; line-height: 100%; margin-top: 0; margin-bottom: 0"><font face="Arial">selectNodes()</font></p>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="50%">
<table border="0" cellpadding="0" cellspacing="0" width="100%" height="123">
<tr>
<td width="33%" height="21"><font face="Arial">All times in ms</font></td>
<td width="33%" height="21"><b><font face="Arial">/*/*/Attr1x500</font></b></td>
<td width="34%" height="21"></td>
</tr>
<tr>
<td width="33%" height="21"></td>
<td width="33%" height="21"><i><font face="Arial">dom4j - elements</font></i></td>
<td width="34%" height="21"><i><font face="Arial">dom4j - attrs</font></i></td>
</tr>
<tr>
<td width="33%" height="18"><b><font face="Arial">1000</font></b></td>
<td width="33%" height="18"><font face="Arial">20.0</font></td>
<td width="34%" height="18"><font face="Arial">36.6</font></td>
</tr>
<tr>
<td width="33%" height="21"><b><font face="Arial">100</font></b></td>
<td width="33%" height="21"><font face="Arial">2.0</font></td>
<td width="34%" height="21"><font face="Arial">4.1</font></td>
</tr>
<tr>
<td width="33%" height="21"><b><font face="Arial">10</font></b></td>
<td width="33%" height="21"><font face="Arial">0.1</font></td>
<td width="34%" height="21"><font face="Arial">0.4</font></td>
</tr>
<tr>
<td width="33%" height="21"><b><font face="Arial">1</font></b></td>
<td width="33%" height="21"><font face="Arial">0.1</font></td>
<td width="34%" height="21"><font face="Arial">0.1</font></td>
</tr>
</table>
</td>
<td width="50%"></td>
</tr>
<tr>
<td width="50%"></td>
</tr>
</table>
<p> </p>
<h3><font face="Arial">c) We also run a simple XSLT test which took the first
XML formant (elements) and transformed it to the second format (attr) or
conversely.</font></h3>
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="74%">
<table border="0" cellpadding="0" cellspacing="0" width="100%">
<tr>
<td width="25%"><font face="Arial">All times in ms.</font></td>
<td width="25%"><i><font face="Arial">dom4j el -> attr</font></i></td>
<td width="25%"><i><font face="Arial">dom4j attr -> el</font></i></td>
<td width="25%"><i><font face="Arial">Xalan el -> attr</font></i></td>
</tr>
<tr>
<td width="25%"><b><font face="Arial">10000</font></b></td>
<td width="25%"><font SIZE="2" face="Arial">12558 </font></td>
<td width="25%"><font SIZE="2" face="Arial">10044 </font></td>
<td width="25%"><font SIZE="2" face="Arial">12338</font></td>
</tr>
<tr>
<td width="33%" height="18"><b><font face="Arial">1000</font></b></td>
<td width="25%"><font face="Arial">1181</font></td>
<td width="25%"><font face="Arial">874</font></td>
<td width="25%"><font face="Arial">1913</font></td>
</tr>
<tr>
<td width="33%" height="21"><b><font face="Arial">100</font></b></td>
<td width="25%"><font face="Arial">98</font></td>
<td width="25%"><font face="Arial">83</font></td>
<td width="25%"><font face="Arial">123</font></td>
</tr>
<tr>
<td width="33%" height="21"><b><font face="Arial">10</font></b></td>
<td width="25%"><font face="Arial">12</font></td>
<td width="25%"><font face="Arial">11</font></td>
<td width="25%"><font face="Arial">20</font></td>
</tr>
<tr>
<td width="33%" height="21"><b><font face="Arial">1</font></b></td>
<td width="25%"><font face="Arial">3</font></td>
<td width="25%"><font face="Arial">4</font></td>
<td width="25%"><font face="Arial">10</font></td>
</tr>
</table>
</td>
<td width="26%"></td>
</tr>
<tr>
<td width="74%"></td>
<td width="26%"></td>
</tr>
</table>
<h2><b><font face="Arial">Conclusion</font></b></h2>
<p><font face="Arial">These number suggest one should use the XPathAPI class of Xalan with great
caution, if at all</font></p>
<p><font face="Arial">The syntax of Xpath statements must be chosen carefully.
Contrary to some belief, and of the topology of our XML format, using /*/* or // was most efficient
compared to the absolute path /ItemResultSet/Item</font> </p>
<p><font face="Arial">It appears more efficient to use selectNodes with Dom4j even if one needs a
single node.</font></p>
<p><font face="Arial">With DOM4J, it is about twice as fast when running XPath
against a document which contains elements vs attributes. </font> </p>
<p><font face="Arial">In our case, we found that Dom4j is faster than Xalant for
XSLT transformations. We do not claim this is a general result, but rather
a datapoint</font> </p>
<h2><b><span lang="en-gb">Resources</span></b></h2>
<p><span lang="en-gb">Here's the source code and data for these tests. Try them
for yourself</span></p>
<table border="0" cellpadding="0" cellspacing="0" style="border-collapse: collapse" bordercolor="#111111">
<tr>
<td width="100%" height="19"><a href="PerfDOM4J.java">PerfDOM4J.java</a></td>
</tr>
<tr>
<td width="100%" height="19"><a href="PerfDOM4JAttr.java">PerfDOM4JAttr.java</a></td>
</tr>
<tr>
<td width="100%" height="21"><a href="PerfW3C.java">PerfW3C.java</a></td>
</tr>
<tr>
<td width="100%" height="19"><a href="item.xslt">item.xslt</a></td>
</tr>
<tr>
<td width="100%" height="19"><a href="w3c_100.xml">w3c_100.xml</a></td>
</tr>
</table>
<p> </p>
<p> </p>
</body>
</html>
See more files for this project here