You are viewing a plain text version of this content. The canonical link for it is here.
Posted to c-dev@xerces.apache.org by bu...@apache.org on 2002/10/16 16:58:49 UTC
DO NOT REPLY [Bug 13695] New: -
Performance problem with large text nodes and XMLFormatter.cpp
DO NOT REPLY TO THIS EMAIL, BUT PLEASE POST YOUR BUG
RELATED COMMENTS THROUGH THE WEB INTERFACE AVAILABLE AT
<http://nagoya.apache.org/bugzilla/show_bug.cgi?id=13695>.
ANY REPLY MADE TO THIS MESSAGE WILL NOT BE COLLECTED AND
INSERTED IN THE BUG DATABASE.
http://nagoya.apache.org/bugzilla/show_bug.cgi?id=13695
Performance problem with large text nodes and XMLFormatter.cpp
Summary: Performance problem with large text nodes and
XMLFormatter.cpp
Product: Xerces-C++
Version: 2.1.0
Platform: PC
OS/Version: Windows NT/2K
Status: NEW
Severity: Normal
Priority: Other
Component: Non-Validating Parser
AssignedTo: xerces-c-dev@xml.apache.org
ReportedBy: spamnps+apachebugzilla@phoenix-int.com
I found a performance problem with large text nodes in
XMLFormatter.cpp::formatBuff(). My node is actually 6MB of base64 encoded
binary data. The code searches the buffer for escape sequences and doesn't find
any (since it is base64 data). Then it goes into an if statement which is
supposed to pass all the data it just checked through the transcoder. The
problem is that it only does one buffer size (about 16K), then loops around and
starts over, checking 6MB - 16K for escape sequences again. I added a while
statement inside the if statment and performance was improved by an order of
magnitude (easily). Here is the patch:
--- XMLFormatter.cpp.old 2002-10-16 10:47:38.000000000 -0400
+++ XMLFormatter.cpp 2002-10-16 10:47:49.000000000 -0400
@@ -358,38 +358,42 @@
//
if (tmpPtr > srcPtr)
{
- const unsigned int srcCount = tmpPtr - srcPtr;
- const unsigned srcChars = srcCount > kTmpBufSize ?
- kTmpBufSize : srcCount;
+
+ while ( tmpPtr > srcPtr )
+ {
+ const unsigned int srcCount = tmpPtr - srcPtr;
+ const unsigned srcChars = srcCount > kTmpBufSize ?
+ kTmpBufSize : srcCount;
- const unsigned int outBytes = fXCoder->transcodeTo
- (
- srcPtr
- , srcChars
- , fTmpBuf
- , kTmpBufSize
- , charsEaten
- , unRepOpts
- );
+ const unsigned int outBytes = fXCoder->transcodeTo
+ (
+ srcPtr
+ , srcChars
+ , fTmpBuf
+ , kTmpBufSize
+ , charsEaten
+ , unRepOpts
+ );
- #if defined(XML_DEBUG)
- if ((outBytes > kTmpBufSize)
- || (charsEaten > srcCount))
- {
- // <TBD> The transcoder is freakin out maaaannn
- }
- #endif
+ #if defined(XML_DEBUG)
+ if ((outBytes > kTmpBufSize)
+ || (charsEaten > srcCount))
+ {
+ // <TBD> The transcoder is freakin out maaaannn
+ }
+ #endif
- // If we get any bytes out, then write them
- if (outBytes)
- {
- fTmpBuf[outBytes] = 0; fTmpBuf[outBytes + 1] = 0;
- fTmpBuf[outBytes + 2] = 0; fTmpBuf[outBytes + 3] = 0;
- fTarget->writeChars(fTmpBuf, outBytes, this);
- }
+ // If we get any bytes out, then write them
+ if (outBytes)
+ {
+ fTmpBuf[outBytes] = 0; fTmpBuf[outBytes + 1] = 0;
+ fTmpBuf[outBytes + 2] = 0; fTmpBuf[outBytes + 3] = 0;
+ fTarget->writeChars(fTmpBuf, outBytes, this);
+ }
- // And bump up our pointer
- srcPtr += charsEaten;
+ // And bump up our pointer
+ srcPtr += charsEaten;
+ }
}
else if (tmpPtr < endPtr)
{
---------------------------------------------------------------------
To unsubscribe, e-mail: xerces-c-dev-unsubscribe@xml.apache.org
For additional commands, e-mail: xerces-c-dev-help@xml.apache.org