|
writers need buffering too: msg#00024java.enhydra.xmlc
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> |
|---|---|---|
| Previous by Date: | Re: Enhydra copyrights and trademarks, Arno Schatz |
|---|---|
| Next by Date: | Re: writers need buffering too, Jacob Kjome |
| Previous by Thread: | AW: Xmlc: Compiler problem, Madl Alfred |
| Next by Thread: | Re: writers need buffering too, Jacob Kjome |
| Indexes: | [Date] [Thread] [Top] [All Lists] |
| News | FAQ | advertise |