Array append performance (Was: Re: Lisp like lists and a problem with TANGO fromStringz)
Bjoern
nanali at nospam-wanadoo.fr
Mon Mar 3 14:40:05 PST 2008
Oskar Linde schrieb:
> bearophile wrote:
>> To: Newsgroups: digitalmars.D
>> Subject: Re: Lisp like lists and a problem with TANGO fromStringz
>>
>> Oskar Linde>Here is a way to reserve space for arrays:<
>>
>> I did try a function equal to that one, but have you timed it? My
>> timing results don't show any advantage of using such reserve.
>
> There are more advantages to do it than speed. Memory fragmentation and
> wastage for example.
>
> <snip>
>
>> OUTPUT TIMINGS:
>>
>> DMD 1.026, N = 12_000_000:
>> append: 3.3 s
>> reserve + append: 3.3 s
>> allocate + assign: 1.0 s
>
>
> It is hard to draw too many conclusions from such a simple test. For one
> thing, the DMD GC will on array appends try to grow the allocated GC
> chunk without reallocating. In an application such as this (with
> virtually no memory fragmentation), there is a good chance that it is
> able to do that almost all the time.
>
> DMD/GDC also seems unable to inline the _d_arrayappendcTp call which
> would be one reason for the rather poor performance overall.
>
> There are cases where the reallocation helps though, even though the
> performance overall is embarrassing compared to not appending.
>
> GDC 0.24, N = 120_000_000:
> append: 9.3 s
> reserve + append: 5.3 s
> allocate + assign: 1.3 s
>
> (Also note that append in this case wastes 168 MB memory compared to
> reserve+append (*))
>
> It is also slightly faster for small arrays, where the GC bucket
> limitation prevents in place growing from happening:
>
> GDC 0.24, N = 512:
> append: 26 µs
> reserve + append: 23 µs
> allocate + assign: 1.7 µs
>
> ----
>
> *) There seems to be a bug (or it might be by design) that the GC on
> appending to an array sometimes allocates up to 3x the required memory
> (to me, it seems anything above 2x is seriously overkill). The line in
> question is in internal/gc/gc.d in Phobos, where the correct line is
> commented out:
>
> //long mult = 100 + (1000L * size) / (6 * log2plus1(newcap));
> long mult = 100 + (1000L * size) / (log2plus1(newcap));
>
> So, for example, appending one int to a 1MB int[] array, could result in
> an array with 3MB reserved space. Or appending a single int to a 74MB
> array results in a 184 MB array. Something to look out for.
>
Gentleman,
somebody out there remembering the topic ? ... :
Bjoern -< OOPS wrong planet.
More information about the Digitalmars-d
mailing list