postMessage (v6)

Revision 6 of this benchmark created on


Description

echoSetTimeout is used when features aren't available. For instance: - No workers (IE6-9, 10?) - No MessageChannel (FF<=4)

Preparation HTML

<script>
  var payload = {
    shortString: 'test',
    longString: (function() {
      var ret = "HELLO WORLD HELLO WORLD HELLO WORLD\n";
      while (ret.length < 5000000) {
        ret = ret + ret;
      }
    })(),
    simple: {
      foo: "bar",
      arr: []
    }
  };
  
  var echoSetTimeout = (function() {
    return function(msg, cb) {
      setTimeout(cb, 0);
    }
  })();
  
  var echoWorker = (function() {
    var code = 'onmessage = function(e) { postMessage(e.data) };';
    var blobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;
    if(!blobBuilder) {
      return echoSetTimeout;
    }
    var bb = new (blobBuilder)();
    bb.append(code);
  
    var blobURL = (window.URL || window.webkitURL || window.mozURL).createObjectURL(bb.getBlob());
    var worker = new Worker(blobURL);
    
    return function(msg, cb) {
      worker.onmessage = cb;
      worker.postMessage(msg);
    };
  })();
  
  var echoIFramePostMessage = (function() {
    var iframe = document.createElement('iframe');
    window.onload = function() {
      iframe.style.display = 'none';
      document.body.appendChild(iframe);
      iframe.contentDocument.write('<html><head><script>onmessage = function(e) { e.source.postMessage(e.data, "*") };<'+'/script><'+'/head><'+'/html>');
    };
    
    return function(msg, cb) {
      window.onmessage = cb;
      iframe.contentWindow.postMessage(msg, '*');
    };
  })();
  
  var echoPostMessage = (function() {
    return function(msg, cb) {
      async = false;
      window.onmessage = cb;
      window.postMessage(msg, '*');
      async = true;
    };
  })();
  
  var echoMessageChannel = (function() {
    if(!window.MessageChannel)
      return echoSetTimeout;
  
    var mc = new MessageChannel();
    return function(msg, cb){
      mc.port1.onmessage = cb;
      mc.port2.postMessage(msg);
    };
  })();
</script>

Test runner

Ready to run.

Testing in
TestOps/sec
Worker shortString
// async test
echoWorker(payload.longString, function resolve() {
  deferred.resolve();
});
ready
sameWindowPostmessage shortString
// async test
echoPostMessage(payload.longString, function resolve() {
  deferred.resolve();
});
ready
setTimeout shortString
// async test
echoSetTimeout(payload.longString, function resolve() {
  deferred.resolve();
});
ready
MessageChannel shortString`
// async test
echoMessageChannel(payload.longString, function resolve() {
  deferred.resolve();
});
ready
iframe shortString
// async test
echoIFramePostMessage(payload.longString, function resolve() {
  deferred.resolve();
});
ready

Revisions

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