setImmediate Test (v28)

Revision 28 of this benchmark created on


Description

set immediate test

Preparation HTML

<script>
    setTimeout(function () {
        if (!window.setImmediate) {
            ui.benchmarks[0].options.defer = false;
        }
        if (!window.msSetImmediate) {
            ui.benchmarks[2].options.defer = false;
        }
        if (!window.MessageChannel) {
            ui.benchmarks[3].options.defer = false;
        } else {
            window.immediateChannel = new MessageChannel();
        }
        if ("onreadystatechange" in document.createElement("script")) {
            window.readyStateChange = true;
        } else {
            ui.benchmarks[4].options.defer = false;
        }

        if (!window.postMessage) {
            ui.benchmarks[5].options.defer = false;
        } else {
            window.immediateCallbacks = {};

            var onGlobalMessage = function (event) {
                if (event.source === window && event.data.indexOf('immediate') === 0) {
                    var handle = 'h' + event.data.substring(9);
                    immediateCallbacks[handle]();
                    delete immediateCallbacks[handle];
                }
            };

            if (window.addEventListener) {
                window.addEventListener("message", onGlobalMessage, false);
            } else {
                window.attachEvent("onmessage", onGlobalMessage);
            }
        }
        window.setImmediateM = (function() {
          var hiddenDiv = document.createElement("div");
          var callbacks = [];
          (new MutationObserver(function(records) {
            var cbList = callbacks.slice();
            callbacks.length = 0;
            cbList.forEach(function(callback) { callback(); });
          })).observe(hiddenDiv, { attributes: true });
        return function setImmediate(callback) {
          if( !callbacks.length) {
            hiddenDiv.setAttribute('yes', 'no');
          }
          callbacks.push(callback);
        };
      })();
        window.setImmediateO = (function() {
          if (!Object.observe) return function(fn) { setTimeout(fn, 0); };
          var dummy = { foo: 0 };
          var callbacks = [];
          Object.observe(dummy, function(records) {
            var cbList = callbacks.slice();
            callbacks.length = 0;
            cbList.forEach(function(callback) { callback(); });
          });
        return function setImmediate(callback) {
          if( !callbacks.length) {
            dummy.foo++;
          }
          callbacks.push(callback);
        };
      })();
        window.setImmediateP = (function() {
          var callbacks = [];
          function run() {
            var cbList = callbacks.slice();
            callbacks.length = 0;
            cbList.forEach(function(callback) { callback(); });
          };
        return function setImmediate(callback) {
          if(!callbacks.length)
            new Promise(function(resolve,reject){resolve();}).then(run);
          callbacks.push(callback);
        };
      })();
    }, 0);
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
setImmediate
// async test
setImmediate(function() {
  deferred.resolve();
});
ready
setTimeout
// async test
setTimeout(function() {
  deferred.resolve();
}, 0);
ready
MessageChannel
// async test
immediateChannel.port1.onmessage = function() {
  deferred.resolve();
};

immediateChannel.port2.postMessage(1);
ready
Promise
// async test
setTimeout(function() {
  deferred.resolve();
}, 0);
ready
postMessage
// async test
var handle = Math.random()

immediateCallbacks['h' + handle] = function() {
  deferred.thisWillFailSynchronously();
};

postMessage('immediate' + handle, "*");

immediateCallbacks['h' + handle] = function() {
  deferred.resolve();
};
ready
image + data-url
// async test
var i = new Image();

i.onload = function() {
  deferred.resolve();
}

i.src = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==";
ready
// async test
setImmediateO(function() {
  deferred.resolve();
});
ready

Revisions

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