In PrintString, move the optimization under the if ( _processEntities ) block and retain the strlen Write in the new else block. Added a test case.
diff --git a/tinyxml2.cpp b/tinyxml2.cpp
index 89b7913..33cf19f 100755
--- a/tinyxml2.cpp
+++ b/tinyxml2.cpp
@@ -2523,14 +2523,16 @@
             ++q;

             TIXMLASSERT( p <= q );

         }

+        // Flush the remaining string. This will be the entire

+        // string if an entity wasn't found.

+        if ( p < q ) {

+            const size_t delta = q - p;

+            const int toPrint = ( INT_MAX < delta ) ? INT_MAX : (int)delta;

+            Write( p, toPrint );

+        }

     }

-    // Flush the remaining string. This will be the entire

-    // string if an entity wasn't found.

-    TIXMLASSERT( p <= q );

-    if ( !_processEntities || ( p < q ) ) {

-        const size_t delta = q - p;

-        const int toPrint = ( INT_MAX < delta ) ? INT_MAX : (int)delta;

-        Write( p, toPrint );

+    else {

+        Write( p );

     }

 }