logo       

writers need buffering too: msg#00024

java.enhydra.xmlc

Subject: writers need buffering too

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();
     }
 
 
 
<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise