From b2e08e4bc09aef0011a16476083f951166786f98 Mon Sep 17 00:00:00 2001 From: Alexander Golubev Date: Mon, 28 Mar 2016 19:51:59 +0300 Subject: [PATCH 1/2] XMLPrinter optimization Stream writing to buffer will be x5 faster --- tinyxml2.cpp | 88 +++++++++++++++++++++++++++++++++++++++------------- tinyxml2.h | 3 ++ 2 files changed, 69 insertions(+), 22 deletions(-) diff --git a/tinyxml2.cpp b/tinyxml2.cpp index 953debf..233243b 100755 --- a/tinyxml2.cpp +++ b/tinyxml2.cpp @@ -2430,10 +2430,36 @@ void XMLPrinter::Print( const char* format, ... ) } +void XMLPrinter::Write( const char* data, size_t size ) +{ + if ( _fp ) { + fwrite ( data , sizeof(char), size, _fp); + } + else { + char* p = _buffer.PushArr( size ) - 1; // back up over the null terminator. + memcpy( p, data, size ); + p[size] = 0; + } +} + + +void XMLPrinter::Putc( char ch ) +{ + if ( _fp ) { + fputc ( ch, _fp); + } + else { + char* p = _buffer.PushArr( sizeof(char) ) - 1; // back up over the null terminator. + p[0] = ch; + p[1] = 0; + } +} + + void XMLPrinter::PrintSpace( int depth ) { for( int i=0; i( bom ) ); } if ( writeDec ) { PushDeclaration( "xml version=\"1.0\"" ); @@ -2506,13 +2533,15 @@ void XMLPrinter::OpenElement( const char* name, bool compactMode ) _stack.Push( name ); if ( _textDepth < 0 && !_firstElement && !compactMode ) { - Print( "\n" ); + Putc( '\n' ); } if ( !compactMode ) { PrintSpace( _depth ); } - Print( "<%s", name ); + Write ( "<" ); + Write ( name ); + _elementJustOpened = true; _firstElement = false; ++_depth; @@ -2522,9 +2551,11 @@ void XMLPrinter::OpenElement( const char* name, bool compactMode ) void XMLPrinter::PushAttribute( const char* name, const char* value ) { TIXMLASSERT( _elementJustOpened ); - Print( " %s=\"", name ); + Write( " " ); + Write( name ); + Write( "=\"" ); PrintString( value, false ); - Print( "\"" ); + Write( "\"" ); } @@ -2574,21 +2605,23 @@ void XMLPrinter::CloseElement( bool compactMode ) const char* name = _stack.Pop(); if ( _elementJustOpened ) { - Print( "/>" ); + Write( "/>" ); } else { if ( _textDepth < 0 && !compactMode) { - Print( "\n" ); + Putc( '\n' ); PrintSpace( _depth ); } - Print( "", name ); + Write ( "" ); } if ( _textDepth == _depth ) { _textDepth = -1; } if ( _depth == 0 && !compactMode) { - Print( "\n" ); + Putc( '\n' ); } _elementJustOpened = false; } @@ -2600,7 +2633,7 @@ void XMLPrinter::SealElementIfJustOpened() return; } _elementJustOpened = false; - Print( ">" ); + Putc( '>' ); } @@ -2610,7 +2643,9 @@ void XMLPrinter::PushText( const char* text, bool cdata ) SealElementIfJustOpened(); if ( cdata ) { - Print( "", text ); + Write( "" ); } else { PrintString( text, true ); @@ -2668,11 +2703,14 @@ void XMLPrinter::PushComment( const char* comment ) { SealElementIfJustOpened(); if ( _textDepth < 0 && !_firstElement && !_compactMode) { - Print( "\n" ); + Putc( '\n' ); PrintSpace( _depth ); } _firstElement = false; - Print( "", comment ); + + Write( "" ); } @@ -2680,11 +2718,14 @@ void XMLPrinter::PushDeclaration( const char* value ) { SealElementIfJustOpened(); if ( _textDepth < 0 && !_firstElement && !_compactMode) { - Print( "\n" ); + Putc( '\n' ); PrintSpace( _depth ); } _firstElement = false; - Print( "", value ); + + Write( "" ); } @@ -2692,11 +2733,14 @@ void XMLPrinter::PushUnknown( const char* value ) { SealElementIfJustOpened(); if ( _textDepth < 0 && !_firstElement && !_compactMode) { - Print( "\n" ); + Putc( '\n' ); PrintSpace( _depth ); } _firstElement = false; - Print( "", value ); + + Write( "" ); } diff --git a/tinyxml2.h b/tinyxml2.h index 9774118..316f2ba 100755 --- a/tinyxml2.h +++ b/tinyxml2.h @@ -2224,6 +2224,9 @@ protected: */ virtual void PrintSpace( int depth ); void Print( const char* format, ... ); + void Write( const char* data, size_t size ); + inline void Write( const char* data ) { Write( data, strlen( data ) ); } + void Putc( char ch ); void SealElementIfJustOpened(); bool _elementJustOpened; From 85aac02172cbd4725d669cc68187dc82477a2148 Mon Sep 17 00:00:00 2001 From: Brad Anderson Date: Tue, 24 Oct 2017 21:48:28 -0600 Subject: [PATCH 2/2] Minor performance tweaks --- tinyxml2.cpp | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/tinyxml2.cpp b/tinyxml2.cpp index 233243b..6d00922 100755 --- a/tinyxml2.cpp +++ b/tinyxml2.cpp @@ -2489,7 +2489,7 @@ void XMLPrinter::PrintString( const char* p, bool restricted ) for( int i=0; i" ); + Putc( '>' ); }