logo       

Re: writers need buffering too: msg#00025

java.enhydra.xmlc

Subject: Re: writers need buffering too


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





<Prev in Thread] Current Thread [Next in Thread>
Google Custom Search

News | FAQ | advertise