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();
> }
>
>
>