setImmediate Test (v7)

Revision 7 of this benchmark created on


Description

set immediate test

Preparation HTML

<script>
    setTimeout(function () {
        'use strict';

        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.immediateCallbacks = {};
            window.immediateChannel = new MessageChannel();

            immediateChannel.port1.onmessage = function (event) {
                immediateCallbacks[event.data]();
                delete immediateCallbacks[event.data];
            };
        }

        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);
            }
        }

        if (window.MutationObserver || window.WebKitMutationObserver) {
            window.element = document.createElement('div');
            window.immediateCallbacks = [];

            new (window.MutationObserver || window.WebKitMutationObserver)(function () {
                immediateCallbacks.forEach(function(callbackFunction) {
                    callbackFunction();
                });

                window.immediateCallbacks = [];
            }).observe(element, {
                attributes: true
            });
        } else {
            ui.benchmarks[6].options.defer = false;
        }
    }, 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
msSetImmediate
// async test
msSetImmediate(function () {
    deferred.resolve();
});
ready
MessageChannel
// async test
var handle = 'h' + Math.random()

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

immediateChannel.port2.postMessage(handle);

immediateCallbacks[handle] = function () {
    deferred.resolve();
};
ready
readyStateChange
// async test
var scriptEl = document.createElement("script");
scriptEl.onreadystatechange = function () {
    scriptEl.onreadystatechange = null;
    scriptEl.parentNode.removeChild(scriptEl);
    scriptEl = null;

    deferred.resolve();
};

document.documentElement.appendChild(scriptEl);
readyStateChange;
ready
postMessage
// async test
var handle = Math.random()

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

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

immediateCallbacks['h' + handle] = function () {
    deferred.resolve();
};
ready
MutationObserver
// async test
immediateCallbacks.push(function () {
    deferred.resolve();
});
element.setAttribute('drainQueue', 'drainQueue');
ready
control case
// async test
deferred.resolve();
ready

Revisions

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