Array append performance

Lionello Lunesu lionello at lunesu.remove.com
Sun Aug 24 22:41:51 PDT 2008


Nevermind. None of that explained why bearophile's program is so slow. This 
does:

int[] ~= int is using _d_arrayappendcT (from internal/gc/gc.d), which 
appends an int by appending its four bytes! Blasphemy! Now we have great 
super-duper-efficient array operations using SSEx but a simple append of an 
int to an int[] is using a "rep movs" to append 4 bytes. X-(

Also, the append code first checks whether the array should be resized, and 
if not, jumps to the actual append code. The common case should not be 
branching: { if (too small) goto resize; append: ... return; resize: ... 
goto append; }

The use of _d_arrayappendcT is hardcoded in the D compiler (e2ir.c) so I 
don't know how to create different code paths for different primitive 
(sizes) other than to add many ifs to _d_arrayappendcT. IIRC, TypeInfo 
contained a pointer to a method for fast array comparisons. Shouldn't a 
similar thing be added for array appends?

BTW, the capacity look-up was indeed using the cached values. Meaning, it's 
not "capacity" we should be focussing on, but the general append code. 
However, if you were to append to two different arrays in a similar loop, 
the performance would be terrible, since each array would overwrite the 
cache with its own ptr/size, resulting in the slow O(m+n) for each capacity 
look-up.

L. 




More information about the Digitalmars-d mailing list