integer log2 vs Math.log(x)/Math.LN2 (v4)

Revision 4 of this benchmark created on


Setup

var x=1234567890.123456789
    
    // http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogLookup
    var logTable256 = function (){ 
        var logTable256=[0,0]
        for (var i = 2; i < 256; i++)
          logTable256[i] = 1 + logTable256[Math.floor(i / 2)]
        return logTable256
    }()
    
    function log2(x) { 
        var v = Math.floor(x)
        var t, tt
    
        if (tt = v >> 16)
          return (t = tt >> 8) ? 24 + logTable256[t] : 16 + logTable256[tt]
        else
          return (t = v >> 8) ? 8 + logTable256[t] : logTable256[v]
    }
    
    var floor=Math.floor,log=Math.log,ln2=Math.LN2
    
    var u = new Uint32Array(2);
    var d = new Float64Array(u.buffer);

Test runner

Ready to run.

Testing in
TestOps/sec
Math.log(x)/Math.LN2
Math.floor(Math.log(x)/Math.LN2)
ready
Math.log(x)/Math.LN2 via local refs
floor(log(x)/ln2)
ready
integer log2
log2(x)
ready
inline integer log2
    var v = floor(x)
    var t, tt
    var r
    if (tt = v >> 16)
      r = (t = tt >> 8) ? 24 + logTable256[t] : 16 + logTable256[tt]
    else
      r = (t = v >> 8) ? 8 + logTable256[t] : logTable256[v]
 
ready
inline integer log2; floor deferred
var v = x
    var t, tt
    var r
    if (tt = v >> 16)
      r = (t = tt >> 8) ? 24 + logTable256[t] : 16 + logTable256[tt]
    else
      r = (t = v >> 8) ? 8 + logTable256[t] : logTable256[floor(v)]
 
ready
uin32 float conversion
u[0] = x;
u[1] = 0x43300000;
d[0] -= 0x10000000000000;
var r = (u[1] >>> 20) - 0x3FF;
 
ready

Revisions

You can edit these tests or add more tests to this page by appending /edit to the URL.