Optimize xml_buffered_writer::write(char_t...)

Make it easier for the compiler to generate good code by loading bufsize
into a local once and returning new offset from flush(). This results in
7% performance gain.

git-svn-id: https://pugixml.googlecode.com/svn/trunk@1024 99668b35-9821-0410-8761-19e4c4f06640
This commit is contained in:
Arseny Kapoulkine 2014-09-25 05:19:41 +00:00
parent ec050e08a4
commit c1829ad29d

View File

@ -3035,10 +3035,11 @@ PUGI__NS_BEGIN
flush(); flush();
} }
void flush() size_t flush()
{ {
flush(buffer, bufsize); flush(buffer, bufsize);
bufsize = 0; bufsize = 0;
return 0;
} }
void flush(const char_t* data, size_t size) void flush(const char_t* data, size_t size)
@ -3100,10 +3101,12 @@ PUGI__NS_BEGIN
void write(const char_t* data, size_t length) void write(const char_t* data, size_t length)
{ {
if (bufsize + length <= bufcapacity) size_t offset = bufsize;
if (offset + length <= bufcapacity)
{ {
memcpy(buffer + bufsize, data, length * sizeof(char_t)); memcpy(buffer + offset, data, length * sizeof(char_t));
bufsize += length; bufsize = offset + length;
} }
else else
{ {
@ -3138,65 +3141,71 @@ PUGI__NS_BEGIN
void write(char_t d0) void write(char_t d0)
{ {
if (bufsize + 1 > bufcapacity) flush(); size_t offset = bufsize;
if (offset > bufcapacity - 1) offset = flush();
buffer[bufsize + 0] = d0; buffer[offset + 0] = d0;
bufsize += 1; bufsize = offset + 1;
} }
void write(char_t d0, char_t d1) void write(char_t d0, char_t d1)
{ {
if (bufsize + 2 > bufcapacity) flush(); size_t offset = bufsize;
if (offset > bufcapacity - 2) offset = flush();
buffer[bufsize + 0] = d0; buffer[offset + 0] = d0;
buffer[bufsize + 1] = d1; buffer[offset + 1] = d1;
bufsize += 2; bufsize = offset + 2;
} }
void write(char_t d0, char_t d1, char_t d2) void write(char_t d0, char_t d1, char_t d2)
{ {
if (bufsize + 3 > bufcapacity) flush(); size_t offset = bufsize;
if (offset > bufcapacity - 3) offset = flush();
buffer[bufsize + 0] = d0; buffer[offset + 0] = d0;
buffer[bufsize + 1] = d1; buffer[offset + 1] = d1;
buffer[bufsize + 2] = d2; buffer[offset + 2] = d2;
bufsize += 3; bufsize = offset + 3;
} }
void write(char_t d0, char_t d1, char_t d2, char_t d3) void write(char_t d0, char_t d1, char_t d2, char_t d3)
{ {
if (bufsize + 4 > bufcapacity) flush(); size_t offset = bufsize;
if (offset > bufcapacity - 4) offset = flush();
buffer[bufsize + 0] = d0; buffer[offset + 0] = d0;
buffer[bufsize + 1] = d1; buffer[offset + 1] = d1;
buffer[bufsize + 2] = d2; buffer[offset + 2] = d2;
buffer[bufsize + 3] = d3; buffer[offset + 3] = d3;
bufsize += 4; bufsize = offset + 4;
} }
void write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4) void write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4)
{ {
if (bufsize + 5 > bufcapacity) flush(); size_t offset = bufsize;
if (offset > bufcapacity - 5) offset = flush();
buffer[bufsize + 0] = d0; buffer[offset + 0] = d0;
buffer[bufsize + 1] = d1; buffer[offset + 1] = d1;
buffer[bufsize + 2] = d2; buffer[offset + 2] = d2;
buffer[bufsize + 3] = d3; buffer[offset + 3] = d3;
buffer[bufsize + 4] = d4; buffer[offset + 4] = d4;
bufsize += 5; bufsize = offset + 5;
} }
void write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4, char_t d5) void write(char_t d0, char_t d1, char_t d2, char_t d3, char_t d4, char_t d5)
{ {
if (bufsize + 6 > bufcapacity) flush(); size_t offset = bufsize;
if (offset > bufcapacity - 6) offset = flush();
buffer[bufsize + 0] = d0; buffer[offset + 0] = d0;
buffer[bufsize + 1] = d1; buffer[offset + 1] = d1;
buffer[bufsize + 2] = d2; buffer[offset + 2] = d2;
buffer[bufsize + 3] = d3; buffer[offset + 3] = d3;
buffer[bufsize + 4] = d4; buffer[offset + 4] = d4;
buffer[bufsize + 5] = d5; buffer[offset + 5] = d5;
bufsize += 6; bufsize = offset + 6;
} }
// utf8 maximum expansion: x4 (-> utf32) // utf8 maximum expansion: x4 (-> utf32)