Re: writers need buffering too

Jacob Kjome <[email protected]> Mon, 17 Nov 2003 18:46:23 -0600
Newsgroups gmane.comp.java.enhydra.xmlc
Message-ID <[email protected]>
Sounds reasonable to me.  I'll commit this if no one objects.

Jake

At 12:27 AM 11/17/2003 +0100, you wrote:
>Hi,
>
>While investigating the speed of an application that uses XMLC 2.2.3, I 
>encountered a serious performance bug in DOMFormatter.  The DOMFormatter 
>is used to write out the HTML (or XML) representation of a DOM tree.  It 
>uses a Writer onto a buffered output stream, but the Writer is itself not 
>wrapped in a BufferedWriter.  Without the BufferedWriter, every invocation 
>of one of the Writer's write() methods causes the allocation of one 
>object, presumably a byte array.  Invoking the single-character-write 
>method is one object worse, presumably it requires a character 
>array.  This includes the frequent invocations to the write methods to 
>emit a '<', '&', and '>' characters.
>
>I didn't perform any serious measurements targeting this particular memory 
>consumer.  I can relate that this fix was part of an effort to reduce 
>memory consumption of a page that allocated approximately 260000 objects 
>to display.  After some playing with a profiler, the memory consumption 
>was reduced by 50%, a significant part of which comes from this XMLC 
>fix.  Find the diff attached below.  I'm interested to hear about the real 
>performance-gain figures.
>
>Regards,
>Pieter Schoenmakers
>
>diff -r -u 
>xmlc-src-2.2.3-/xmlc/modules/xmlc/src/org/enhydra/xml/io/DOMFormatter.java 
>xmlc-src-2.2.3/xmlc/modules/xmlc/src/org/enhydra/xml/io/DOMFormatter.java
>--- 
>xmlc-src-2.2.3-/xmlc/modules/xmlc/src/org/enhydra/xml/io/DOMFormatter.java 
>2003-03-10 10:36:16.000000000 +0100
>+++ 
>xmlc-src-2.2.3/xmlc/modules/xmlc/src/org/enhydra/xml/io/DOMFormatter.java 
>2003-11-13 12:05:37.000000000 +0100
>@@ -26,6 +26,7 @@
>  import org.enhydra.xml.dom.DOMOps;
>  import org.enhydra.xml.dom.DOMAccess;
>  import java.io.Writer;
>+import java.io.BufferedWriter;
>  import java.io.StringWriter;
>  import java.io.ByteArrayOutputStream;
>  import java.io.OutputStreamWriter;
>@@ -199,8 +200,8 @@
>      public void write(Node node,
>                        OutputStream out) throws IOException {
>          Formatter formatter = getFormatter(node, fOptions, false);
>-        Writer writer = new OutputStreamWriter(out,
>-                                               formatter.getMIMEEncoding());
>+        Writer writer = new BufferedWriter (new OutputStreamWriter(out,
>+                                               formatter.getMIMEEncoding()));
>          formatter.write(node, writer);
>          writer.flush();
>      }
>
>
>