potential speed improvement for repeated string concatenation

downs default_357-line at yahoo.de
Tue Jul 24 02:08:34 PDT 2007


Here's something interesting I noticed while writing serialization code.
If you're in a situation where you have to repeatedly append small to medium sized chunks of string 
to a buffer, and the computation of those chunks is relatively cheap, it might be faster (and use 
less memory) to do it in two passes: first, determining the size of the result string, then 
allocating it completely and filling it in.
I noticed this while trying to figure out why my serialization code for YAWR was so atrociously 
slow. I'm passing the ser method a void delegate(char[]) that it's supposed to call with the 
strings it serializes, in order. So normally, serialization would look like this:

char[] buffer; ser(data, (char[] f) { buffer~=f; });

When I figured out that it was the primarily bottleneck that caused the delays while saving, I 
replaced it with the following code

size_t len=0;
ser(data, (char[] f) { len+=f.length; });
auto buffer=new char[len]; len=0;
ser(data, (char[] f) { buffer[len..len+f.length]=f; len+=f.length; }

To my surprise, this more than doubled the speed of that code. So if you have some block of code 
that does lots of repeated string concats, you might want to give this a try.
  --downs



More information about the Digitalmars-d mailing list