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...