On Thursday, 4 July 2013 at 13:43:13 UTC, Joseph Rushton Wakeling wrote:
On 07/04/2013 03:05 PM, monarch_dodra wrote:
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?

Quite right -- the case of isNaN being false is the case that needs to be really
quick.

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'd assumed that putting the start/stop of the stopwatch inside the loop would
address that, but apparently not ...

Holly crap, I didn't see that. Don't do that. The problem if you do that is that on a lot of machines, the time it takes to do 1 iteration is shorter than the granularity of the clock. For example, on windows, it is typically 15 ms, which is HUGE! I think *nix is more precise, but not *that* precise either. If you are unlucky, the system clock may increment between iterations, meaning you'll miss out on that time.

In particular, if your tests last 30ms, it can make a big difference. I usually try to make sure my tests last at least a whole second. I also try to add an entire second of warm up, the time it takes for the OS to get its caching done.

I also try to run the tests in such a way that each case is tested several times alternatively. Sometimes, you'd be surprised with the result.

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.

See attached. I haven't put in the dummy warmup loop, but as is, there's consistently less than 2ms difference between the times reported for all compilers. If I use rdmd without optimizations, the difference is slightly
larger at 3-5ms.

Cool. Even gdmd? Your first trial showed 150 vs 30 ms.

So, on the basis of that I think I feel happy about using isNaN as a test, especially as it lets me remove an otherwise superfluous variable from
RandomSample.  Thanks for the advice! :-)

No problem. Seeing people make tests is always interesting. You could also throw in a few "inf" in there, as inf is *really* close binary wise to NaN: It will pass the first "test", and not the second. But I think inf's are even rarer then NaN's, so...

Also, those tests are with inline? Could you report the times without please (for my own curiosity)?

Reply via email to