Optimising ‘+=’ and ‘+’ operators for strings.

This simple code:

var s = "";
for(var i = 0; i < 50000; ++i) {
  s += "*";
}

code used to run in Sciter in 874ms.

After implementing simple and obvious optimization it runs now in just 4ms.

String concatenation was implemented as simple string allocation of size(r) = size(s1) + size(s2) and memcpy of s1 and s2 into that new string r.

Memory allocation in script is cheap - just increment memory pointer by size of requested memory chunk and you are done. So in theory that naïve strcat shall be lightning fast. But it is definitely not. There is a hidden cost of GC cycles - at the moment of concatenation r,s1 and s2 shall be present in memory.

So "0123456789" + "A" needs memory for 10 + 1 + 11 = 22 characters. And on each iteration that number increases - the VM is busy cleaning garbage most of the time.

So when someone from C# and Java crowds is saying you that memory allocation is cheap take it with a grain of salt.

Comments (2)

Leave a Reply