Performance of loops

Steven Schveighoffer via Digitalmars-d digitalmars-d at puremagic.com
Fri Apr 24 06:55:50 PDT 2015


On 4/24/15 9:13 AM, Chris wrote:
> On Friday, 24 April 2015 at 11:53:56 UTC, Marc Schütz wrote:
>> Most of the time is taken up by the array's allocation. The optimizers
>> of both DMD and LDC evidently doesn't optimize it away when you use
>> `ref`, even though it could in theory.
>>
>> Remove the `enum` and just use a normal global variable, and you will
>> get more or less identical times for all three loops. LDC even turns
>> then into empty functions (didn't check for DMD).
>
> I've tried it, and the loops indeed show similar results. What is it
> about `enum` that slows it down?

enum of an array literal is like pasting the array literal wherever the 
enum lives.

So for example, your const loop:

void constLoop() {
   size_t cnt;
   foreach (const ref w; words)
     cnt += w.length;
}

Is really like saying:

void constLoop() {
   size_t cnt;
   foreach (const ref w; ["Hello", "world", "Ola", "mundo"])
     cnt += w.length;
}

And note that in D right now, an array literal is NOT stored in the data 
segment. It's generated every time you use it (with a call to 
_d_newarray, which allocates on the GC).

There was a push a while back to make array literals immutable and 
placed in the data segment. But it never panned out, would break too 
much code.

-Steve


More information about the Digitalmars-d mailing list