Thread overview
Results are in: static foreach is a slower than hand unrolling your loops or using mixins.
Apr 29, 2010
Gareth Charnock
Apr 29, 2010
Gareth Charnock
Re: Results are in: static foreach is a slower than hand unrolling your
Apr 30, 2010
bearophile
Apr 30, 2010
BCS
Apr 30, 2010
Gareth Charnock
April 29, 2010
I managed to get some free time to look at this and it would appear that static foreach is slower than hand unrolling a loop. Fortunately there are no detectable differences between hand unrolling a loop and building the body of the loop in a compile time string and using a mixin. Results are here:

http://github.com/gcharnock/phoboslinalgebra/blob/4d1f62ce2f866acf24f237be77a2b59158571de0/staticloop_results.txt

Test program is here:

http://github.com/gcharnock/phoboslinalgebra/blob/4d1f62ce2f866acf24f237be77a2b59158571de0/staticloops.d
April 29, 2010
Correction, two of the loops were going backwards (mixin and hand unrolled). Fixed this but the conclusion remains the same.

Gareth Charnock wrote:
> I managed to get some free time to look at this and it would appear that static foreach is slower than hand unrolling a loop. Fortunately there are no detectable differences between hand unrolling a loop and building the body of the loop in a compile time string and using a mixin. Results are here:
> 
> http://github.com/gcharnock/phoboslinalgebra/blob/4d1f62ce2f866acf24f237be77a2b59158571de0/staticloop_results.txt 
> 
> 
> Test program is here:
> 
> http://github.com/gcharnock/phoboslinalgebra/blob/4d1f62ce2f866acf24f237be77a2b59158571de0/staticloops.d 
> 
April 30, 2010
You can try LDC compiler too (D1 only) with few changes.
Note: LDC isn't using LLVM 2.7 yet.

Bye,
bearophile
April 30, 2010
Hello Gareth,

> I managed to get some free time to look at this and it would appear
> that static foreach is slower than hand unrolling a loop. Fortunately
> there are no detectable differences between hand unrolling a loop and
> building the body of the loop in a compile time string and using a
> mixin. Results are here:

Last time I checked, static foreach tended to load the index onto the stack for each iteration even if it was never used. Did you take a look at the ASM?

-- 
... <IXOYE><



April 30, 2010
I don't actually know assembly language so no, this is all purely empirical.

BCS wrote:
> Hello Gareth,
> 
>> I managed to get some free time to look at this and it would appear
>> that static foreach is slower than hand unrolling a loop. Fortunately
>> there are no detectable differences between hand unrolling a loop and
>> building the body of the loop in a compile time string and using a
>> mixin. Results are here:
> 
> Last time I checked, static foreach tended to load the index onto the stack for each iteration even if it was never used. Did you take a look at the ASM?
>