Loop optimization
Steven Schveighoffer
schveiguy at yahoo.com
Fri May 14 07:15:39 PDT 2010
On Thu, 13 May 2010 22:38:40 -0400, kai <kai at nospam.zzz> wrote:
> Hello,
>
> I was evaluating using D for some numerical stuff. However I was
> surprised to
> find that looping & array indexing was not very speedy compared to
> alternatives (gcc et al). I was using the DMD2 compiler on mac and
> windows,
> with -O -release. Here is a boiled down test case:
>
> void main (string[] args)
> {
> double [] foo = new double [cast(int)1e6];
> for (int i=0;i<1e3;i++)
> {
> for (int j=0;j<1e6-1;j++)
> {
> foo[j]=foo[j]+foo[j+1];
> }
> }
> }
>
> Any ideas? Am I somehow not hitting a vital compiler optimization?
> Thanks for
> your help.
I figured it out.
in D, the default value for doubles is nan, so you are adding countless
scores of nan's which is costly for some reason (not a big floating point
guy, so I'm not sure about this).
In C/C++, the default value for doubles is 0.
BTW, without any initialization of the array, what are you expecting the
code to do? In the C++ version, I suspect you are simply adding a bunch
of 0s together.
Equivalent D code which first initializes the array to 0s:
void main (string[] args)
{
double [] foo = new double [cast(int)1e6];
foo[] = 0; // probably want to change this to something more meaningful
for (int i=0;i<cast(int)1e3;i++)
{
for (int j=0;j<cast(int)1e6-1;j++)
{
foo[j]+=foo[j+1];
}
}
}
On my PC, it runs almost exactly at the same speed as the C++ version.
-Steve
More information about the Digitalmars-d-learn
mailing list