On Thursday, 4 July 2013 at 12:53:48 UTC, Joseph Rushton Wakeling wrote:
Hi all,

A trivial little benchmark for comparing the performance of a function using if(!booleanValue) as a conditional, versus one using if(isNan(x)).

Run with dmd -O -release -inline -noboundscheck on my system, I find the two are virtually equivalent, with it taking about 30ms for 1 million if(!boolean)
versus about 31 for a million if(isNaN(floatingpoint)).

With ldmd2 and the same optimizations, I get about 25 compared to 27-28 ms for
the two cases, again with a million realizations of each.

Finally, with gdmd I get 30ms for a million if(!boolean) versus about 150ms for
a million if(isNaN(floatingpoint)).

Code attached, feel free to critique. Generally I think these results show that the difference between checking a boolean and checking isNan are negligible, but I'm surprised at the relatively bad performance with gdmd and I wonder if
there's some particular reason for this.

The relevance is to a fix I'm preparing for this bug:
http://d.puremagic.com/issues/show_bug.cgi?id=10322

See also: http://forum.dlang.org/post/lcrwybqszclitzrav...@forum.dlang.org

Thanks in advance for any feedback :-)

Best wishes,

    -- Joe

Me thinks the test is biased with answering true to isNan. You should first initialize your arrays with random [true/false] | [nan/nonan] value. In particular, it is more important for isNan to answer "No" as fast as possible, rather than actually find nan's. (common, use case is checking that a number is *not*) nan. I'd say a mix of 90% rands + 10% Nan's would be representative?

Also, there might be optimizations in bool iteration over double iteration given their size, as well as the fact that the "first" test is typically faster.

I think you should create an array of S{bool; double;} So that the iteration is not biased either.

I'd add a dummy "warmup" loop of 10% of the iterations too, just 'cause.

Gotta go.

Reply via email to