Author: jboynes Date: Sat Nov 29 19:34:16 2014 New Revision: 1642467 URL: http://svn.apache.org/r1642467 Log: Add benchmark to compare Xalan vs. JDK XPath speed. Xalan is still faster
Modified: tomcat/taglibs/standard/trunk/impl/src/test/java/org/apache/taglibs/standard/tag/common/xml/ForEachTagTest.java Modified: tomcat/taglibs/standard/trunk/impl/src/test/java/org/apache/taglibs/standard/tag/common/xml/ForEachTagTest.java URL: http://svn.apache.org/viewvc/tomcat/taglibs/standard/trunk/impl/src/test/java/org/apache/taglibs/standard/tag/common/xml/ForEachTagTest.java?rev=1642467&r1=1642466&r2=1642467&view=diff ============================================================================== --- tomcat/taglibs/standard/trunk/impl/src/test/java/org/apache/taglibs/standard/tag/common/xml/ForEachTagTest.java (original) +++ tomcat/taglibs/standard/trunk/impl/src/test/java/org/apache/taglibs/standard/tag/common/xml/ForEachTagTest.java Sat Nov 29 19:34:16 2014 @@ -20,7 +20,12 @@ import java.io.InputStream; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.IterationTag; +import javax.xml.namespace.QName; import javax.xml.parsers.DocumentBuilder; +import javax.xml.xpath.XPathConstants; +import javax.xml.xpath.XPathExpression; +import javax.xml.xpath.XPathFactory; +import javax.xml.xpath.XPathVariableResolver; import org.junit.Assert; import org.junit.Before; @@ -28,6 +33,7 @@ import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; +import org.apache.xml.dtm.DTMIterator; import org.apache.xpath.XPath; import org.apache.xpath.XPathContext; import org.apache.xpath.objects.XObject; @@ -35,9 +41,11 @@ import static org.easymock.EasyMock.crea import static org.easymock.EasyMock.expect; import static org.easymock.EasyMock.replay; import static org.easymock.EasyMock.verify; +import static org.junit.Assert.assertEquals; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; +import org.w3c.dom.NodeList; /** */ @@ -74,13 +82,13 @@ public class ForEachTagTest { XPathContext context = tag.getContext(); Assert.assertTrue(tag.hasNext()); Node one = (Node) tag.next(); - Assert.assertEquals("one", one.getTextContent()); + assertEquals("one", one.getTextContent()); Assert.assertTrue(tag.hasNext()); Node two = (Node) tag.next(); - Assert.assertEquals("two", two.getTextContent()); + assertEquals("two", two.getTextContent()); Assert.assertTrue(tag.hasNext()); Node three = (Node) tag.next(); - Assert.assertEquals("three", three.getTextContent()); + assertEquals("three", three.getTextContent()); Assert.assertFalse(tag.hasNext()); tag.doFinally(); Assert.assertTrue(context.getContextNodeListsStack().isEmpty()); @@ -99,17 +107,17 @@ public class ForEachTagTest { XPathContext context = tag.getContext(); tag.hasNext(); tag.next(); - Assert.assertEquals("3", last.execute(context, context.getCurrentNode(), null).str()); - Assert.assertEquals("one", dot.execute(context, context.getCurrentNode(), null).str()); - Assert.assertEquals("1", position.execute(context, context.getCurrentNode(), null).str()); + assertEquals("3", last.execute(context, context.getCurrentNode(), null).str()); + assertEquals("one", dot.execute(context, context.getCurrentNode(), null).str()); + assertEquals("1", position.execute(context, context.getCurrentNode(), null).str()); tag.hasNext(); tag.next(); - Assert.assertEquals("two", dot.execute(context, context.getCurrentNode(), null).str()); - Assert.assertEquals("2", position.execute(context, context.getCurrentNode(), null).str()); + assertEquals("two", dot.execute(context, context.getCurrentNode(), null).str()); + assertEquals("2", position.execute(context, context.getCurrentNode(), null).str()); tag.hasNext(); tag.next(); - Assert.assertEquals("three", dot.execute(context, context.getCurrentNode(), null).str()); - Assert.assertEquals("3", position.execute(context, context.getCurrentNode(), null).str()); + assertEquals("three", dot.execute(context, context.getCurrentNode(), null).str()); + assertEquals("3", position.execute(context, context.getCurrentNode(), null).str()); verify(pageContext); } @@ -117,15 +125,7 @@ public class ForEachTagTest { @Test public void testIterationPerformance() throws Exception { // create a large document - final int SIZE = 200000; - test = XmlUtil.newEmptyDocument(); - Element root = test.createElement("root"); - test.appendChild(root); - for (int i = 0; i < SIZE; i++) { - Element child = test.createElement("a"); - child.setTextContent(Integer.toString(i)); - root.appendChild(child); - } + test = newBenchmarkDocument(200000); XPath dot = new XPath(".", null, null, XPath.SELECT); expect(pageContext.findAttribute("doc")).andStubReturn(test); @@ -135,13 +135,90 @@ public class ForEachTagTest { XObject result = null; if (tag.doStartTag() == IterationTag.EVAL_BODY_INCLUDE) { do { -// XPathContext context = tag.getContext(); -// result = dot.execute(context, context.getCurrentNode(), null); + XPathContext context = tag.getContext(); + result = dot.execute(context, context.getCurrentNode(), null); } while (tag.doAfterBody() == IterationTag.EVAL_BODY_AGAIN); tag.doFinally(); } time += System.nanoTime(); -// System.err.println("result = " + result.str()); System.err.println("time = " + time/1000000 + "ms."); + assertEquals("199999", result.str()); + } + + @Ignore + @Test + public void xalanPerformance() throws Exception{ + Document doc = newBenchmarkDocument(200000); + expect(pageContext.findAttribute("doc")).andStubReturn(doc); + replay(pageContext); + + XPath select = new XPath("$doc/root/a", null, null, XPath.SELECT); + XPath dot = new XPath(".", null, null, XPath.SELECT); + XObject result = null; + + long time = -System.nanoTime(); + XPathContext context = new XPathContext(false); + context.setVarStack(new JSTLVariableStack(pageContext)); + int dtm = context.getDTMHandleFromNode(XmlUtil.newEmptyDocument()); + context.pushCurrentNodeAndExpression(dtm, dtm); + + // create an iterator over the returned nodes and push into the context + XObject nodes = select.execute(context, context.getCurrentNode(), null); + DTMIterator iterator = nodes.iter(); + context.pushContextNodeList(iterator); + while (iterator.getCurrentPos() < iterator.getLength()) { + int next = iterator.nextNode(); + context.pushCurrentNode(next); + iterator.getDTM(next).getNode(next); + + result = dot.execute(context, context.getCurrentNode(), null); + + context.popCurrentNode(); + } + time += System.nanoTime(); + System.err.println("time = " + time/1000000 + "ms."); + assertEquals("199999", result.str()); + } + + @Ignore + @Test + public void xpathPerformance() throws Exception { + final Document doc = newBenchmarkDocument(200000); + expect(pageContext.findAttribute("doc")).andStubReturn(doc); + replay(pageContext); + + XPathVariableResolver resolver = new XPathVariableResolver() { + public Object resolveVariable(QName variableName) { + return doc; + } + }; + XPathFactory factory = XPathFactory.newInstance(XPathFactory.DEFAULT_OBJECT_MODEL_URI, "com.sun.org.apache.xpath.internal.jaxp.XPathFactoryImpl", null); + System.out.println("factory.getClass() = " + factory.getClass()); + factory.setXPathVariableResolver(resolver); + XPathExpression select = factory.newXPath().compile("$doc/root/a"); + XPathExpression dot = factory.newXPath().compile("."); + Node result = null; + + long time = -System.nanoTime(); + NodeList nodes = (NodeList) select.evaluate(XmlUtil.newEmptyDocument(), XPathConstants.NODESET); + for (int i = 0; i < nodes.getLength(); i++) { + Node context = nodes.item(i); + result = (Node) dot.evaluate(context, XPathConstants.NODE); + } + time += System.nanoTime(); + System.err.println("time = " + time/1000000 + "ms."); + assertEquals("199999", result.getTextContent()); + } + + private static Document newBenchmarkDocument(int size) { + Document doc = XmlUtil.newEmptyDocument(); + Element root = doc.createElement("root"); + doc.appendChild(root); + for (int i = 0; i < size; i++) { + Element child = doc.createElement("a"); + child.setTextContent(Integer.toString(i)); + root.appendChild(child); + } + return doc; } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org