When I slowly build a big string out of little bits, the worst thing to do in most languages is to just use string concatenation:
for(something) {
str .= little_bit;
}
Why? Everytime a little bit is added to str
, there must be a new string allocated big enough to contain str
and the new little bit. Then the actual str
must be copied in. In most languages there are constructs to efficiently build strings like this instead of concatenating. StringBuffer in C#. StringIO in Python.
But no, PHP has to be stupid. There is no nice construct and you’ll end up using concatenation. So, I thought to be smart and make use of PHP array’s and implode
. Arrays are here for having elements added and removed all the time so they are properly buffered and should be great at having lots of small elements added. And when I want to pack it all into one big string, I can use PHP’s builtin implode
function.
I wanted to try it out and created two scripts: a.php
concats a little (10byte) string one million times and b.php
appends it to an array and then implode
s it. And because I’m also interested in the performance of implode
I got a script c.php
that’s identical to b.php
but doesn’t implode afterwards. These are the results:
a.php (concat) | 0.320s |
---|---|
b.php (array append and implode) | 0.814s |
c.php (array append) | 0.732s |
Indeed, string concatenation with all its allocation and copying is actually faster than plain simple array appending. PHP is stupid.