On Thursday, 5 November 2015 at 11:14:50 UTC, Marc Schütz wrote:
On Thursday, 5 November 2015 at 03:52:47 UTC, TheFlyingFiddle wrote: Can you publish two compilable and runnable versions of the code that exhibit the difference? Then we can have a look at the generated assembly. If there's really different code being generated depending on whether the .init value is explicitly set to float.nan or not, then this suggests there is a bug in DMD.

I created a simple example here:

struct A { float x, y, z ,w; }
struct B
{
   float x=float.nan;
   float y=float.nan;
   float z=float.nan;
   float w=float.nan;
}

void initVal(T)(ref T t, ref float k)
{
    pragma(inline, false);
    t.x = k;
    t.y = k * 2;
    t.z = k / 2;
    t.w = k^^3;
}


__gshared A[] a;
void benchA()
{
    A val;
    foreach(float f; 0 .. 1000_000)
    {
        val = A.init;
        initVal(val, f);
        a ~= val;
    }
}

__gshared B[] b;
void benchB()
{
    B val;
    foreach(float f; 0 .. 1000_000)
    {
        val = B.init;
        initVal(val, f);
        b ~= val;
    }
}


int main(string[] argv)
{
    import std.datetime;
    import std.stdio;

    auto res = benchmark!(benchA, benchB)(1);
    writeln("Default: ", res[0]);
    writeln("Explicit: ", res[1]);
        
    return 0;
}

output:

Default:  TickDuration(1637842)
Explicit: TickDuration(167088)

~10x slowdown...


Reply via email to