asm.js - for loop (v2)

Revision 2 of this benchmark created by radsoc on


Preparation HTML

<script>
var loopLen = 0x100000; // 1,048,576
var h32 = new Uint32Array(loopLen);

var loop_asm = (function(std, ffi, heap) {
  "use asm";
  var heap32 = new std.Uint32Array(heap);
  var heapLen = ffi.heapLen;

  function loop() {
    var i = 0;
    var hLen = 0;
    hLen = (heapLen() | 0) << 2;
    while (1) {
      heap32[i >> 2] = i >> 2;
      i = i + 4 | 0;
      if (i >>> 0 == hLen >>> 0) {
        break;
      }
    }
  }
  return {
    loop: loop
  };
})(window, {
  heapLen: function() {
    return loopLen;
  }
}, h32.buffer).loop;

var loop_asm_without_pragma = (function(std, ffi, heap) {
  var heap32 = new std.Uint32Array(heap);
  var heapLen = ffi.heapLen;

  function loop() {
    var i = 0;
    var hLen = 0;
    hLen = (heapLen() | 0) << 2;
    while (1) {
      heap32[i >> 2] = i >> 2;
      i = i + 4 | 0;
      if (i >>> 0 == hLen >>> 0) {
        break;
      }
    }
  }
  return {
    loop: loop
  };
})(window, {
  heapLen: function() {
    return loopLen;
  }
}, h32.buffer).loop;

var loop_closure = (function(heap) {
  var heap32 = new Uint32Array(heap);
  var heapLen = heap32.length;

  function loop() {
    for (var i = 0, hLen = heapLen; i < hLen; i++) {
      heap32[i] = i;
    }
  }
  return {
    loop: loop
  };
})(h32.buffer).loop;
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
loop - native
for (var i = 0, hLen = loopLen; i < hLen; i++) {
  h32[i] = i;
}
ready
loop - asm
loop_asm();
ready
loop - asm without pragma
loop_asm_without_pragma();
ready
loop - closure
loop_closure();
ready

Revisions

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

  • Revision 1: published by radsoc on
  • Revision 2: published by radsoc on