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

Revision 3 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 y = 1234567890;
    
    function log2int(n) {
      var r = 0;
      while (n > 0) {
        n >>= 1;
        r++;
      }
      return r;
    }

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
log2int
log2int(y)
ready

Revisions

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