Advertisement
Noseratio

SO-18826570

Sep 16th, 2013
480
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4.     <!-- http://stackoverflow.com/q/18826570/1768303 -->
  5.     <!-- based on http://dbaron.org/log/20100309-faster-timeouts -->
  6.     <!-- requires IE10 or Chrome. Firefox doesn't support MessageChannel yet -->
  7.     <title></title>
  8.     <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  9.     <script type="text/javascript">
  10.  
  11.         // setTimeoutMC via MessageChannel
  12.  
  13.         (function () {
  14.             "use strict";
  15.             var i = 0;
  16.             var timeouts = {};
  17.             var setApiName = "setTimeoutMC";
  18.             var clearApiName = "clearTimeoutMC";
  19.  
  20.             var channel = new MessageChannel();
  21.  
  22.             function post(fn) {
  23.                 if (i === 0x100000000) // max queue size
  24.                     i = 0;
  25.                 if (++i in timeouts)
  26.                     throw new Error(setApiName + " queue overflow.");
  27.                 timeouts[i] = fn;
  28.                 channel.port2.postMessage(i);
  29.                 return i;
  30.             }
  31.  
  32.             channel.port1.onmessage = function (ev) {
  33.                 var id = ev.data;
  34.                 var fn = timeouts[id];
  35.                 if (fn) {
  36.                     delete timeouts[id];
  37.                     fn();
  38.                 }
  39.             }
  40.  
  41.             function clear(id) {
  42.                 delete timeouts[id];
  43.             }
  44.  
  45.             channel.port1.start();
  46.             channel.port2.start();
  47.  
  48.             window[setApiName] = post;
  49.             window[clearApiName] = clear;
  50.         })();
  51.  
  52.         // setTimeoutPM via window.postMessage
  53.  
  54.         (function () {
  55.             "use strict";
  56.             var i = 0;
  57.             var timeouts = {};
  58.             var setApiName = "setTimeoutPM";
  59.             var clearApiName = "clearTimeoutPM";
  60.             var messageName = setApiName + new Date().getTime();
  61.  
  62.             function post(fn) {
  63.                 if (i === 0x100000000) // max queue size
  64.                     i = 0;
  65.                 if (++i in timeouts)
  66.                     throw new Error(setApiName + " queue overflow.");
  67.                 timeouts[i] = fn;
  68.                 window.postMessage({ type: messageName, id: i }, "*");
  69.                 return i;
  70.             }
  71.  
  72.             function receive(ev) {
  73.                 if (ev.source !== window)
  74.                     return;
  75.                 var data = ev.data;
  76.                 if (data && data instanceof Object && data.type === messageName) {
  77.                     ev.stopPropagation();
  78.                     var id = ev.data.id;
  79.                     var fn = timeouts[id];
  80.                     if (fn) {
  81.                         delete timeouts[id];
  82.                         fn();
  83.                     }
  84.                 }
  85.             }
  86.  
  87.             function clear(id) {
  88.                 delete timeouts[id];
  89.             }
  90.  
  91.             window.addEventListener("message", receive, true);
  92.             window[setApiName] = post;
  93.             window[clearApiName] = clear;
  94.         })();
  95.  
  96.         // timing
  97.  
  98.         function runtest() {
  99.             var output = document.getElementById("output");
  100.             var outputText = document.createTextNode("");
  101.             output.appendChild(outputText);
  102.             function printOutput(line) {
  103.                 outputText.data += line + "\n";
  104.             }
  105.  
  106.             var n = 2000;
  107.             var i = 0;
  108.             var startTime = Date.now();
  109.             setTimeoutMC(testMC);
  110.  
  111.             function testMC() {
  112.                 if (++i === n) {
  113.                     var endTime = Date.now();
  114.                     printOutput(n + " iterations of setTimeoutMC took " + (endTime - startTime) + " milliseconds.");
  115.                     i = 0;
  116.                     startTime = Date.now();
  117.                     setTimeoutPM(testPM, 0);
  118.                 } else {
  119.                     setTimeoutMC(testMC);
  120.                 }
  121.             }
  122.  
  123.             function testPM() {
  124.                 if (++i === n) {
  125.                     var endTime = Date.now();
  126.                     printOutput(n + " iterations of setTimeoutPM took " + (endTime - startTime) + " milliseconds.");
  127.                     i = 0;
  128.                     startTime = Date.now();
  129.                     setTimeout(test, 0);
  130.                 } else {
  131.                     setTimeoutPM(testPM);
  132.                 }
  133.             }
  134.  
  135.             function test() {
  136.                 if (++i === n) {
  137.                     var endTime = Date.now();
  138.                     printOutput(n + " iterations of setTimeout(0) took " + (endTime - startTime) + " milliseconds.");
  139.                 }
  140.                 else {
  141.                     setTimeout(test, 0);
  142.                 }
  143.             }
  144.         }
  145.     </script>
  146. </head>
  147.  
  148. <body onload="runtest()">
  149.     <pre id="output"></pre>
  150. </body>
  151. </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement