<br><font size=2 face="sans-serif">I tried using the latest (non queue version) and got the following, shows some quite dramatic savings on large files.</font>
<br>
<br><font size=2 color=blue face="Courier New">Reuse=true &nbsp; &nbsp; &nbsp; &nbsp;size=1884 &nbsp; &nbsp; &nbsp; &nbsp;time: 595</font>
<br><font size=2 color=blue face="Courier New">Reuse=false &nbsp; &nbsp; &nbsp; &nbsp;size=1884 &nbsp; &nbsp; &nbsp; &nbsp;time: 187</font>
<br>
<br><font size=2 color=blue face="Courier New">Reuse=true &nbsp; &nbsp; &nbsp; &nbsp;size=21363 &nbsp; &nbsp; &nbsp; &nbsp;time: 440</font>
<br><font size=2 color=blue face="Courier New">Reuse=false &nbsp; &nbsp; &nbsp; &nbsp;size=21363 &nbsp; &nbsp; &nbsp; &nbsp;time: 438</font>
<br>
<br><font size=2 color=blue face="Courier New">Reuse=true &nbsp; &nbsp; &nbsp; &nbsp;size=42527 &nbsp; &nbsp; &nbsp; &nbsp;time: 703</font>
<br><font size=2 color=blue face="Courier New">Reuse=false &nbsp; &nbsp; &nbsp; &nbsp;size=42527 &nbsp; &nbsp; &nbsp; &nbsp;time: 563</font>
<br>
<br><font size=2 color=blue face="Courier New">Reuse=true &nbsp; &nbsp; &nbsp; &nbsp;size=318591 &nbsp; &nbsp; &nbsp; &nbsp;time: 8420</font>
<br><font size=2 color=blue face="Courier New">Reuse=false &nbsp; &nbsp; &nbsp; &nbsp;size=318591 &nbsp; &nbsp; &nbsp; &nbsp;time: 5503</font>
<br>
<br><font size=2 color=blue face="Courier New">Reuse=true &nbsp; &nbsp; &nbsp; &nbsp;size=743381 &nbsp; &nbsp; &nbsp; &nbsp;time: 23266</font>
<br><font size=2 color=blue face="Courier New">Reuse=false &nbsp; &nbsp; &nbsp; &nbsp;size=743381 &nbsp; &nbsp; &nbsp; &nbsp;time: 13844</font>
<br>
<br><font size=2 face="sans-serif">However, I then changed the code to use _builder in both the if and else (just to see what the natural variation would be like) and got the following, now I am really confused as the re-use = false does the same stuff as re-use = true, it also instantiates a new object and it still takes less time.</font>
<br>
<br><font size=2 color=#820040 face="Courier New"><b>if</b></font><font size=2 face="Courier New"> (_reuse) {</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; &nbsp; &nbsp; _builder.build(source);</font>
<br><font size=2 face="Courier New">} </font><font size=2 color=#820040 face="Courier New"><b>else</b></font><font size=2 face="Courier New"> {</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; &nbsp; &nbsp; SAXBuilder builder = </font><font size=2 color=#820040 face="Courier New"><b>new</b></font><font size=2 face="Courier New"> SAXBuilder();</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; &nbsp; &nbsp; _builder.build(source);</font>
<br><font size=2 face="Courier New">}</font>
<br>
<br><font size=2 color=blue face="Courier New">Reuse=true &nbsp; &nbsp; &nbsp; &nbsp;size=1884 &nbsp; &nbsp; &nbsp; &nbsp;time: 513</font>
<br><font size=2 color=blue face="Courier New">Reuse=false &nbsp; &nbsp; &nbsp; &nbsp;size=1884 &nbsp; &nbsp; &nbsp; &nbsp;time: 140</font>
<br>
<br><font size=2 color=blue face="Courier New">Reuse=true &nbsp; &nbsp; &nbsp; &nbsp;size=21363 &nbsp; &nbsp; &nbsp; &nbsp;time: 406</font>
<br><font size=2 color=blue face="Courier New">Reuse=false &nbsp; &nbsp; &nbsp; &nbsp;size=21363 &nbsp; &nbsp; &nbsp; &nbsp;time: 297</font>
<br>
<br><font size=2 color=blue face="Courier New">Reuse=true &nbsp; &nbsp; &nbsp; &nbsp;size=42527 &nbsp; &nbsp; &nbsp; &nbsp;time: 594</font>
<br><font size=2 color=blue face="Courier New">Reuse=false &nbsp; &nbsp; &nbsp; &nbsp;size=42527 &nbsp; &nbsp; &nbsp; &nbsp;time: 734</font>
<br>
<br><font size=2 color=blue face="Courier New">Reuse=true &nbsp; &nbsp; &nbsp; &nbsp;size=318591 &nbsp; &nbsp; &nbsp; &nbsp;time: 7719</font>
<br><font size=2 color=blue face="Courier New">Reuse=false &nbsp; &nbsp; &nbsp; &nbsp;size=318591 &nbsp; &nbsp; &nbsp; &nbsp;time: 5486</font>
<br>
<br><font size=2 color=blue face="Courier New">Reuse=true &nbsp; &nbsp; &nbsp; &nbsp;size=743381 &nbsp; &nbsp; &nbsp; &nbsp;time: 22297</font>
<br><font size=2 color=blue face="Courier New">Reuse=false &nbsp; &nbsp; &nbsp; &nbsp;size=743381 &nbsp; &nbsp; &nbsp; &nbsp;time: 14423</font><font size=2 face="sans-serif"><br>
<br>
/Phill<br>
IS Dept, Software Engineer.<br>
phill_perryman@mitel.com<br>
http://www.mitel.com<br>
Tel: +44 1291 436023</font>
<br>
<br>
<br>
<table width=100%>
<tr valign=top>
<td>
<td><font size=1 face="sans-serif"><b>Per Norrman &lt;per.norrman@austers.se&gt;</b></font>
<br><font size=1 face="sans-serif">Sent by: jdom-interest-bounces@servlets.com</font>
<p><font size=1 face="sans-serif">31/08/2004 07:39</font>
<br>
<td><font size=1 face="Arial">&nbsp; &nbsp; &nbsp; &nbsp; </font>
<br><font size=1 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; To: &nbsp; &nbsp; &nbsp; &nbsp;David Wall &lt;d.wall@computer.org&gt;</font>
<br><font size=1 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; cc: &nbsp; &nbsp; &nbsp; &nbsp;jdom-interest@jdom.org</font>
<br><font size=1 face="sans-serif">&nbsp; &nbsp; &nbsp; &nbsp; Subject: &nbsp; &nbsp; &nbsp; &nbsp;Re: [jdom-interest] Thread questions regarding JDOM SAXBuiler?</font></table>
<br>
<br>
<br><font size=2 face="Courier New">Hi,<br>
<br>
I meant to make the program self-cotained but missed the dependency<br>
on the concurrent jar. Here's a new version. You should run the test<br>
in your environment to confirm the results.<br>
<br>
Yes, documents are discarded after being built. There are many variations<br>
you can do in a test like this. My guess is that it's String/StringBuffer<br>
handling in SAXBuilder and/or Xerces that accounts for the resuts.<br>
<br>
A typical output in my environment (P3, 850Mhz, Dell Latitude C600):<br>
<br>
Reuse=true &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size=21731 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time: 5720<br>
Reuse=false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size=21731 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time: 2215<br>
<br>
Reuse=true &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size=1918 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time: 200<br>
Reuse=false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size=1918 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time: 300<br>
<br>
Reuse=true &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size=21731 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time: 1200<br>
Reuse=false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size=21731 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time: 2065<br>
<br>
Reuse=true &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size=43259 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time: 3697<br>
Reuse=false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size=43259 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time: 2663<br>
<br>
Reuse=true &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size=324070 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time: 25435<br>
Reuse=false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size=324070 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time: 22233<br>
<br>
Reuse=true &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size=756109 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time: 66417<br>
Reuse=false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; size=756109 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time: 53194<br>
<br>
The first run should be disregarded. Used for warming-up.<br>
<br>
/pmn<br>
<br>
David Wall wrote:<br>
<br>
&gt; Peter,<br>
&gt; <br>
&gt; Thanks for your input. &nbsp;Can you share the results you got?<br>
&gt; <br>
&gt; Can anybody explain that behavior? &nbsp;It sounds suspect. &nbsp;Of course, the cost<br>
&gt; of creating a SAXBuilder should go down relative to the time for parsing as<br>
&gt; the XML file gets bigger, but the cost of construction shouldn't change much<br>
&gt; unless there's a memory leak in the program. &nbsp;For example, are the Documents<br>
&gt; created from build() being destroyed? &nbsp;Is it just the garbage collector<br>
&gt; that's entering the picture? &nbsp;I know that the modern GC does well with lots<br>
&gt; of small objects coming and going because that's the most typical scenario<br>
&gt; (especially String). &nbsp;But it seems odd that the construction of an object<br>
&gt; would change just because bigger XML files are used in the build() method.<br>
&gt; <br>
<br>
package large;<br>
<br>
import java.io.StringReader;<br>
import java.text.DateFormat;<br>
import java.text.DateFormatSymbols;<br>
import java.util.Calendar;<br>
import java.util.Date;<br>
<br>
import org.jdom.Comment;<br>
import org.jdom.Document;<br>
import org.jdom.Element;<br>
import org.jdom.input.SAXBuilder;<br>
import org.jdom.output.XMLOutputter;<br>
import org.xml.sax.InputSource;<br>
<br>
/**<br>
 * @author Per Norrman<br>
 * &nbsp;<br>
 */<br>
public class ThreadedReader {<br>
 &nbsp; &nbsp;private boolean _reuse = true;<br>
<br>
 &nbsp; &nbsp;private String _xml = &quot;&quot;;<br>
<br>
 &nbsp; &nbsp;private long _time = 0;<br>
<br>
 &nbsp; &nbsp;public ThreadedReader(boolean reuse) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;_reuse = reuse;<br>
 &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp;public synchronized void addTime(long elapsed) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;_time += elapsed;<br>
 &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp;public synchronized long getTime() {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;return _time;<br>
 &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp;public void reset() {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;_time = 0;<br>
 &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp;public void process(String start, String end, int count) throws Exception {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;reset();<br>
 &nbsp; &nbsp; &nbsp; &nbsp;generate(start, end);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;// create threads<br>
 &nbsp; &nbsp; &nbsp; &nbsp;int each = count / 5;</font>
<br><font size=2 face="Courier New">&nbsp; &nbsp; &nbsp; &nbsp; Thread[] thread = new Thread[5];<br>
 &nbsp; &nbsp; &nbsp; &nbsp;for (int i = 0; i &lt; 5; ++i) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;thread[i] = new ReaderThread(_reuse, each);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;thread[i].start();<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;for (int i = 0; i &lt; 5; ++i) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;thread[i].join();<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;// report<br>
 &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(&quot;Reuse=&quot; + _reuse + &quot;\tsize=&quot; + _xml.length()<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;+ &quot;\ttime: &quot; + getTime());<br>
 &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp;public void generate(String startDate, String endDate) throws Exception {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;DateFormat df = DateFormat.getDateInstance(DateFormat.SHORT);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;DateFormatSymbols dfs = new DateFormatSymbols();<br>
 &nbsp; &nbsp; &nbsp; &nbsp;String[] weekDays = dfs.getWeekdays();<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Element root = new Element(&quot;root&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Document doc = new Document(root);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;doc.getContent().add(0,<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;new Comment(&quot; Generated: &quot; + df.format(new Date()) + &quot; &quot;));<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Calendar cal = Calendar.getInstance();<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Date start = df.parse(startDate);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;Date end = df.parse(endDate);<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;cal.setTime(start);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;while (cal.getTime().before(end)) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Element date = new Element(&quot;day&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;date.addContent(new Element(&quot;date&quot;).setText(df<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;.format(cal.getTime())));<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;root.addContent(date);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;String weekDay = weekDays[cal.get(Calendar.DAY_OF_WEEK)];<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Element day = new Element(&quot;dayname&quot;).setText(weekDay);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;date.addContent(day);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;cal.add(Calendar.DATE, 1);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;XMLOutputter out = new XMLOutputter();<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;_xml = out.outputString(doc);<br>
<br>
 &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp;public static void test(String start, String end) throws Exception {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;System.out.println();<br>
 &nbsp; &nbsp; &nbsp; &nbsp;new ThreadedReader(true).process(start, end, 20);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;new ThreadedReader(false).process(start, end, 20);<br>
 &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp;public static void main(String[] args) throws Exception {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;test(&quot;2000-01-01&quot;, &quot;2001-01-01&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;test(&quot;2000-01-01&quot;, &quot;2000-02-01&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;test(&quot;2000-01-01&quot;, &quot;2001-01-01&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;test(&quot;2000-01-01&quot;, &quot;2001-12-31&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;test(&quot;1990-01-01&quot;, &quot;2004-12-31&quot;);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;test(&quot;1970-01-01&quot;, &quot;2004-12-31&quot;);<br>
 &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp;private class ReaderThread extends Thread {<br>
 &nbsp; &nbsp; &nbsp; &nbsp;private boolean _reuse = true;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;private int _count = 0;<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;private SAXBuilder _builder = new SAXBuilder();<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;public ReaderThread(boolean reuse, int count) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_reuse = reuse;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_count = count;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_builder.setReuseParser(reuse);<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;private void parse(InputSource source) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;long elapsed = 0;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;try {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;elapsed = System.currentTimeMillis();<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if (_reuse) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_builder.build(source);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} else {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;SAXBuilder builder = new SAXBuilder();<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;_builder.build(source);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;elapsed = System.currentTimeMillis() - elapsed;<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;addTime(elapsed);<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;} catch (Exception e) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;System.out.println(getName() + &quot;: &quot; + e.getMessage());<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
<br>
 &nbsp; &nbsp; &nbsp; &nbsp;public void run() {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;while (_count-- &gt; 0) {<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;parse(new InputSource(new StringReader(_xml)));<br>
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp; &nbsp; &nbsp;}<br>
 &nbsp; &nbsp;}<br>
<br>
}_______________________________________________<br>
To control your jdom-interest membership:<br>
http://www.jdom.org/mailman/options/jdom-interest/youraddr@yourhost.com</font>
<br>
<br>