nexttick (v8)

Revision 8 of this benchmark created by Miller Medeiros on


Setup

var nextTick1 = function () {
      // Firefox doesn't support MessageChannel so we use something that works..
      if (!('MessageChannel' in window)) {
        return function(fn) { setTimeout(fn, 0) }
      }
      var channel = new MessageChannel();
      var queue = [];
      channel.port1.onmessage = function () {
        queue.shift()();
      };
      function nextTick(fn) {
        queue.push(fn);
        channel.port2.postMessage();
      }
      return nextTick;
    }();
    
    var nextTick2 = function () {
      function nextTick(fn) {
        return setTimeout(fn, 0);
      }
      return nextTick;
    }();
    
    
    var nextTick3 = function () {
      function nextTick(fn) {
        var image = new Image();
        image.onerror = fn;
        image.src = 'data:,foo';
      }
      return nextTick;
    }();
    
    var nextTick4 = function () {
      function nextTick(fn) {
        var script = document.createElement('script');
        script.onload = function() {
          document.body.removeChild(script);
          fn();
        }
        script.src = 'data:text/javascript,';
        document.body.appendChild(script);
      }
      return nextTick;
    }();
    
    var nextTick5 = function () {
    // FAILS ON SOME BROWSERS SO USE SETTIMEOUT INSTEAD
      function nextTick(fn) {
        var req = new XMLHttpRequest;
        req.open('GET','data:text/plain,foo', false);
        req.onreadystatechange = function() {
          req.onreadystatechange = null;
          fn();
        };
        req.send(null);
      }
      return nextTick;
    }();
    
    var nextTick6 = function () {
      var key = 'nextTick__' + Math.random();
      var queue = [];
      window.addEventListener('message', function (e) {
        if (e.data !== key) {
          return;
        }
        queue.shift()();
      },false);
    
      function nextTick(fn) {
        queue.push(fn);
        window.postMessage(key, '*');
      }
    
      return nextTick;
    }();
    
    var nextTick7 = function () {
      function nextTick(fn) {
        requestAnimationFrame(fn);
      }
      return nextTick;
    }();
    
    var nextTick8 = function () {
      var resolved = Promise.resolve();
      function nextTick(fn) {
        resolved.then(fn);
      }
      return nextTick;
    }();

Test runner

Ready to run.

Testing in
TestOps/sec
MessageChannel (fallback to setTimeout on Firefox)
// async test
nextTick1(function() {
  deferred.resolve();
});
ready
setTimeout
// async test
nextTick2(function() {
  deferred.resolve();
});
ready
Image.onerror
// async test
nextTick3(function() {
  deferred.resolve();
});
ready
script.onload
// async test
nextTick4(function() {
  deferred.resolve();
});
ready
window.onmessage
// async test
nextTick6(function() {
  deferred.resolve();
});
ready
requestAnimationFrame
// async test
nextTick7(function() {
  deferred.resolve();
});
ready
Promise.prototype.then
// async test
nextTick8(function() {
  deferred.resolve();
});
ready

Revisions

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