• Subject: Re: Fastest way to determine number is integer in plain Lua
• Date: Sat, 8 Nov 2008 20:41:14 +0300

>> -----------------------------------------------------------------------------
>>                name |     rel |   delta | abs / iter = ms per iteration
>>
>> -----------------------------------------------------------------------------
>>            noop_int |  1.0000 |  0.0000 |   8.83 /   50000000 = 0.176600
>> ms
>> ...
>
> A minor problem... my brain keeps on doing a mental double-take whenever I
> see "ms", because I keep interpreting that as milliseconds. "ns" might be
> easier for the brain to interpret, because for microseconds, one must
> compare fractions, while for nanoseconds, one can look at the integer
> portion and quickly get an idea of its magnitude. But it's a minor thing.

I've changed ms in the script output to the less ambiguous us -- it is closer to the µ (mu) letter for the microseconds. Hopefully it would help.

> Thanks again for keeping the list supplied with benchmark data!

You're welcome. I'm glad you're interested! :-)

BTW, here are the results of the last benchmark with 1e9 iterations. (I replaced us to µs here.)

lua
-------------------------------------------------------------------
name |     rel | abs s / iter = µ
s (1e-6 s) / iter
-------------------------------------------------------------------
mod_int |  1.0000 | 220.20 / 1000000000 = 0.220200
µs
bits_int_direct |  1.0038 | 221.04 / 1000000000 = 0.221040
µs
mod_int_direct |  1.0088 | 222.14 / 1000000000 = 0.222140
µs
mod_nonint_direct |  1.0308 | 226.98 / 1000000000 = 0.226980
µs
mod_nonint |  1.0325 | 227.36 / 1000000000 = 0.227360
µs
bits_nonint |  1.0482 | 230.81 / 1000000000 = 0.230810
µs
bits_nonint_direct |  1.0559 | 232.52 / 1000000000 = 0.232520
µs
bits_int |  1.0757 | 236.86 / 1000000000 = 0.236860
µs
floor_nonint_direct |  1.4797 | 325.83 / 1000000000 = 0.325830
µs
floor_int |  1.5225 | 335.25 / 1000000000 = 0.335250
µs
floor_nonint |  1.5365 | 338.34 / 1000000000 = 0.338340
µs
floor_int_direct |  1.5404 | 339.20 / 1000000000 = 0.339200
µs
luajit -O
-------------------------------------------------------------------
name |     rel | abs s / iter =
µs (1e-6 s) / iter
-------------------------------------------------------------------
bits_int |  1.0000 |  28.36 / 1000000000 = 0.028360
µs
bits_int_direct |  1.1185 |  31.72 / 1000000000 = 0.031720
µs
bits_nonint_direct |  1.1308 |  32.07 / 1000000000 = 0.032070
µs
bits_nonint |  1.1590 |  32.87 / 1000000000 = 0.032870
µs
mod_int |  1.1862 |  33.64 / 1000000000 = 0.033640
µs
mod_nonint |  1.2895 |  36.57 / 1000000000 = 0.036570
µs
mod_int_direct |  1.3258 |  37.60 / 1000000000 = 0.037600
µs
mod_nonint_direct |  1.3385 |  37.96 / 1000000000 = 0.037960
µs
floor_nonint |  1.4721 |  41.75 / 1000000000 = 0.041750
µs
floor_int |  1.4746 |  41.82 / 1000000000 = 0.041820
µs
floor_nonint_direct |  1.6255 |  46.10 / 1000000000 = 0.046100
µs
floor_int_direct |  1.7059 |  48.38 / 1000000000 = 0.048380
µs

On plain Lua there is not much difference between a%1 and 2^52 versions. Also direct and indirect versions are clearly almost identical, and the difference between them is too close to the measurement error to be relevant.

Alexander.