<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
<META NAME="Generator" CONTENT="MS Exchange Server version 5.5.2655.35">
<TITLE>RE: [jdom-interest] Toward beta 9</TITLE>
</HEAD>
<BODY>

<P><FONT SIZE=2>How serious are people about performance in Verifier?</FONT>
</P>

<P><FONT SIZE=2>Using a relatively random input source (the characters in various Jars), I can get a 500% - 1000% performance improvement in Verifier.</FONT></P>

<P><FONT SIZE=2>This is relatively simple, and &quot;just as logical&quot; as the existing verifier.</FONT>
</P>

<P><FONT SIZE=2>Have a look at the attached code, it is a &quot;new&quot; Verifier, with a main method which has a relatively clunky, but effective performance test comparison between the existing checks, and the proposed checks.</FONT></P>

<P><FONT SIZE=2>On my linux box I am getting performance improvements from 5.6 ms/10000 chars to 0.7ms/10000 chars. I know that the numbers are rough, but people with profilers may be able to substantiate them better.</FONT></P>

<P><FONT SIZE=2>The basic principal is to build a bitmask representing all the valid letters/combinations. The bitmask has 0xffff+1 bits, i.e. is 8K (relatively small), and there is 1 for each &quot;test&quot;. I have done only the isXMLLetter, and isXMLCombiner. The pre-processing overhead is relatively small, (on my box I measure 23ms).</FONT></P>

<P><FONT SIZE=2>Have a look-see, and tell me if I am barking up the wrong tree. I haven't neatened up the code too much, but the principal seems good.</FONT></P>

<P><FONT SIZE=2>I have been running:</FONT>
</P>

<P><FONT SIZE=2>ant package</FONT>
<BR><FONT SIZE=2>java -cp build/jdom.jar org.jdom.Verifier 5 lib/*.jar</FONT>
</P>

<P><FONT SIZE=2>and getting results:</FONT>
</P>

<P><FONT SIZE=2>Building lettermask</FONT>
<BR><FONT SIZE=2>Done in 22ms.</FONT>
<BR><FONT SIZE=2>Building combinationmask</FONT>
<BR><FONT SIZE=2>Done in 0ms.</FONT>
<BR><FONT SIZE=2>OLD Iteration lib/ant.jar count 0 took 6.93ms/10000 chars, counted 176182 trues in 732481 characters .</FONT>
<BR><FONT SIZE=2>NEW Iteration lib/ant.jar count 0 took 0.76ms/10000 chars, counted 176182 trues in 732481 characters .</FONT>
<BR><FONT SIZE=2>OLD Iteration lib/ant.jar count 1 took 5.61ms/10000 chars, counted 176182 trues in 732481 characters .</FONT>
<BR><FONT SIZE=2>NEW Iteration lib/ant.jar count 1 took 0.76ms/10000 chars, counted 176182 trues in 732481 characters .</FONT>
<BR><FONT SIZE=2>OLD Iteration lib/ant.jar count 2 took 5.66ms/10000 chars, counted 176182 trues in 732481 characters .</FONT>
<BR><FONT SIZE=2>NEW Iteration lib/ant.jar count 2 took 0.76ms/10000 chars, counted 176182 trues in 732481 characters .</FONT>
<BR><FONT SIZE=2>OLD Iteration lib/ant.jar count 3 took 5.69ms/10000 chars, counted 176182 trues in 732481 characters .</FONT>
<BR><FONT SIZE=2>NEW Iteration lib/ant.jar count 3 took 0.76ms/10000 chars, counted 176182 trues in 732481 characters .</FONT>
<BR><FONT SIZE=2>OLD Iteration lib/ant.jar count 4 took 5.61ms/10000 chars, counted 176182 trues in 732481 characters .</FONT>
<BR><FONT SIZE=2>NEW Iteration lib/ant.jar count 4 took 0.76ms/10000 chars, counted 176182 trues in 732481 characters .</FONT>
<BR><FONT SIZE=2>OLD Iteration lib/jaxen-core.jar count 0 took 5.34ms/10000 chars, counted 41039 trues in 160965 characters .</FONT>
<BR><FONT SIZE=2>NEW Iteration lib/jaxen-core.jar count 0 took 0.86ms/10000 chars, counted 41039 trues in 160965 characters .</FONT>
<BR><FONT SIZE=2>OLD Iteration lib/jaxen-core.jar count 1 took 5.34ms/10000 chars, counted 41039 trues in 160965 characters .</FONT>
<BR><FONT SIZE=2>NEW Iteration lib/jaxen-core.jar count 1 took 0.8ms/10000 chars, counted 41039 trues in 160965 characters .</FONT>
<BR><FONT SIZE=2>OLD Iteration lib/jaxen-core.jar count 2 took 5.34ms/10000 chars, counted 41039 trues in 160965 characters .</FONT>
<BR><FONT SIZE=2>NEW Iteration lib/jaxen-core.jar count 2 took 0.8ms/10000 chars, counted 41039 trues in 160965 characters .</FONT>
<BR><FONT SIZE=2>OLD Iteration lib/jaxen-core.jar count 3 took 5.34ms/10000 chars, counted 41039 trues in 160965 characters .</FONT>
<BR><FONT SIZE=2>NEW Iteration lib/jaxen-core.jar count 3 took 0.8ms/10000 chars, counted 41039 trues in 160965 characters .</FONT>
<BR><FONT SIZE=2>OLD Iteration lib/jaxen-core.jar count 4 took 5.34ms/10000 chars, counted 41039 trues in 160965 characters .</FONT>
<BR><FONT SIZE=2>NEW Iteration lib/jaxen-core.jar count 4 took 0.8ms/10000 chars, counted 41039 trues in 160965 characters .</FONT>
<BR><FONT SIZE=2>........</FONT>
</P>
<BR>

<P><FONT SIZE=2>Rolf</FONT>
</P>
<BR>

<P><FONT SIZE=2>-----Original Message-----</FONT>
<BR><FONT SIZE=2>From: Elliotte Rusty Harold [<A HREF="mailto:elharo@metalab.unc.edu">mailto:elharo@metalab.unc.edu</A>]</FONT>
<BR><FONT SIZE=2>Sent: Thursday, April 10, 2003 7:54 AM</FONT>
<BR><FONT SIZE=2>To: jdom-interest@jdom.org</FONT>
<BR><FONT SIZE=2>Subject: Re: [jdom-interest] Toward beta 9</FONT>
</P>
<BR>

<P><FONT SIZE=2>At 10:55 PM -0700 4/9/03, Philip Nelson wrote:</FONT>
<BR><FONT SIZE=2>&gt;Has anybody tried this approach?</FONT>
<BR><FONT SIZE=2>&gt;</FONT>
<BR><FONT SIZE=2>&gt;create a package protected or inner subclass of DefaultJDOMFactory in</FONT>
<BR><FONT SIZE=2>&gt;SAXBuilder.&nbsp; Then in the factory, for example...</FONT>
<BR><FONT SIZE=2>&gt;</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp; private class NoCheckText extends Text</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp; {</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public void noCheck(String text) {</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; value = text;</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp; public Text text(String text) {</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NoCheckText t = new NoCheckText();</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t.noCheck(text);</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return (Text) t;</FONT>
<BR><FONT SIZE=2>&gt;&nbsp;&nbsp;&nbsp;&nbsp; }</FONT>
</P>
<BR>

<P><FONT SIZE=2>That looks like it might actually work without causing too many </FONT>
<BR><FONT SIZE=2>problems or further complicating the API, though it does depend on </FONT>
<BR><FONT SIZE=2>those protected, do-nothing, no-args constructors that I wish we </FONT>
<BR><FONT SIZE=2>didn't have.</FONT>
<BR><FONT SIZE=2>-- </FONT>
</P>

<P><FONT SIZE=2>+-----------------------+------------------------+-------------------+</FONT>
<BR><FONT SIZE=2>| Elliotte Rusty Harold | elharo@metalab.unc.edu | Writer/Programmer |</FONT>
<BR><FONT SIZE=2>+-----------------------+------------------------+-------------------+</FONT>
<BR><FONT SIZE=2>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Processing XML with Java (Addison-Wesley, 2002)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |</FONT>
<BR><FONT SIZE=2>|&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <A HREF="http://www.cafeconleche.org/books/xmljava" TARGET="_blank">http://www.cafeconleche.org/books/xmljava</A>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |</FONT>
<BR><FONT SIZE=2>| <A HREF="http://www.amazon.com/exec/obidos/ISBN%3D0201771861/cafeaulaitA" TARGET="_blank">http://www.amazon.com/exec/obidos/ISBN%3D0201771861/cafeaulaitA</A>&nbsp; |</FONT>
<BR><FONT SIZE=2>+----------------------------------+---------------------------------+</FONT>
<BR><FONT SIZE=2>|&nbsp; Read Cafe au Lait for Java News:&nbsp; <A HREF="http://www.cafeaulait.org/" TARGET="_blank">http://www.cafeaulait.org/</A>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; |</FONT>
<BR><FONT SIZE=2>|&nbsp; Read Cafe con Leche for XML News: <A HREF="http://www.cafeconleche.org/" TARGET="_blank">http://www.cafeconleche.org/</A>&nbsp;&nbsp;&nbsp; |</FONT>
<BR><FONT SIZE=2>+----------------------------------+---------------------------------+</FONT>
<BR><FONT SIZE=2>_______________________________________________</FONT>
<BR><FONT SIZE=2>To control your jdom-interest membership:</FONT>
<BR><FONT SIZE=2><A HREF="http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@yourhost.com" TARGET="_blank">http://lists.denveronline.net/mailman/options/jdom-interest/youraddr@yourhost.com</A></FONT>
</P>

</BODY>
</HTML>