Advertisement
phenomnomnominal

Untitled

Jan 10th, 2013
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #workerBench.js
  2. var root,
  3.   __hasProp = {}.hasOwnProperty;
  4.  
  5. root = typeof exports !== "undefined" && exports !== null ? exports : this;
  6.  
  7. root.WorkerBench = (function(workerBench) {
  8.   var finishedBenchmark, generateResult, runBenchmark, runBenchmarks, start, _options, _ref;
  9.   if (workerBench == null) {
  10.     workerBench = {};
  11.   }
  12.   if ((typeof Worker !== "undefined" && Worker !== null) && (typeof Worker === 'function' || typeof Worker === 'object')) {
  13.     _options = {};
  14.     if ((_ref = window.performance) == null) {
  15.       window.performance = {};
  16.     }
  17.     performance.now = (function() {
  18.       return performance.now || performance.webkitNow || performance.msNow || performance.oNow || performance.mozNow || function() {
  19.         return Date.now() - (performance.initTime || 0);
  20.       };
  21.     })();
  22.     performance.initTime = performance.now();
  23.     workerBench.result = function() {
  24.       console.log('Benchmark not yet complete.');
  25.       return false;
  26.     };
  27.     workerBench.init = function(options) {
  28.       var constant, defaultOptions, _initStart;
  29.       if (options == null) {
  30.         options = {};
  31.       }
  32.       defaultOptions = {
  33.         maxWorkersToTestFor: 16,
  34.         numberOfTimesToBenchmark: 5,
  35.         pathToWorkerScript: 'javascripts/workers'
  36.       };
  37.       _initStart = constant = function(key, value) {
  38.         return Object.defineProperty(this, key, {
  39.           get: function() {
  40.             return value;
  41.           },
  42.           set: function() {
  43.             throw Error('Cannot set value of constant!');
  44.           }
  45.         });
  46.       };
  47.       constant.call(_options, 'MAX_WORKERS_TO_TEST_FOR', options.maxWorkersToTestFor || defaultOptions.maxWorkersToTestFor);
  48.       constant.call(_options, 'NUMBER_OF_TIMES_TO_BENCHMARK', options.numberOfTimesToBenchmark || defaultOptions.numberOfTimesToBenchmark);
  49.       constant.call(_options, 'PATH_TO_WORKER_SCRIPT', options.pathToWorkerScript || defaultOptions.pathToWorkerScript);
  50.       return start();
  51.     };
  52.     start = function() {
  53.       return runBenchmarks();
  54.     };
  55.     runBenchmarks = function(workersPerBenchmark, results) {
  56.       var _i, _ref1, _results;
  57.       if (workersPerBenchmark == null) {
  58.         workersPerBenchmark = (function() {
  59.           _results = [];
  60.           for (var _i = 1, _ref1 = _options.MAX_WORKERS_TO_TEST_FOR; 1 <= _ref1 ? _i <= _ref1 : _i >= _ref1; 1 <= _ref1 ? _i++ : _i--){ _results.push(_i); }
  61.           return _results;
  62.         }).apply(this);
  63.       }
  64.       if (results == null) {
  65.         results = {};
  66.       }
  67.       if (workersPerBenchmark.length !== 0) {
  68.         return runBenchmark(workersPerBenchmark, results);
  69.       } else {
  70.         workerBench.result = function() {
  71.           return generateResult(results);
  72.         };
  73.         console.log("Optimum Web Workers: " + (workerBench.result()));
  74.         return console.log("Benchmarks took: " + (performance.now() - performance.initTime) + ".");
  75.       }
  76.     };
  77.     runBenchmark = function(workersPerBenchmark, results, finished, workers) {
  78.       var n, nWorkers, onMessage, timeout, _i, _j, _results,
  79.         _this = this;
  80.       if (finished == null) {
  81.         finished = [];
  82.       }
  83.       if (workers == null) {
  84.         workers = [];
  85.       }
  86.       nWorkers = workersPerBenchmark.shift();
  87.       timeout = 100 / nWorkers;
  88.       onMessage = function() {
  89.         var worker, _i, _len, _ref1;
  90.         finished.push("DONE");
  91.         if (finished.length === nWorkers) {
  92.           if ((_ref1 = results[nWorkers]) == null) {
  93.             results[nWorkers] = [];
  94.           }
  95.           results[nWorkers].push(performance.now() - start);
  96.           for (_i = 0, _len = workers.length; _i < _len; _i++) {
  97.             worker = workers[_i];
  98.             worker.terminate();
  99.           }
  100.           return finishedBenchmark(nWorkers, workersPerBenchmark, results);
  101.         }
  102.       };
  103.       start = performance.now();
  104.       for (n = _i = 0; 0 <= nWorkers ? _i < nWorkers : _i > nWorkers; n = 0 <= nWorkers ? ++_i : --_i) {
  105.         workers[n] = new Worker("" + _options.PATH_TO_WORKER_SCRIPT + "/worker.js");
  106.         workers[n].addEventListener('message', onMessage);
  107.       }
  108.       _results = [];
  109.       for (n = _j = 0; 0 <= nWorkers ? _j < nWorkers : _j > nWorkers; n = 0 <= nWorkers ? ++_j : --_j) {
  110.         _results.push(workers[n].postMessage({
  111.           func: 'benchmark',
  112.           timeout: timeout
  113.         }));
  114.       }
  115.       return _results;
  116.     };
  117.     finishedBenchmark = function(nWorkers, workersPerBenchmark, results) {
  118.       if (results[nWorkers].length < _options.NUMBER_OF_TIMES_TO_BENCHMARK) {
  119.         workersPerBenchmark.unshift(nWorkers);
  120.       } else {
  121.         if (_options.NUMBER_OF_TIMES_TO_BENCHMARK > 3) {
  122.           results[nWorkers].splice(results[nWorkers].indexOf(Math.max.apply(Math, results[nWorkers])), 1);
  123.           results[nWorkers].splice(results[nWorkers].indexOf(Math.min.apply(Math, results[nWorkers])), 1);
  124.         }
  125.         results[nWorkers] = (results[nWorkers].reduce(function(sum, next) {
  126.           return sum + next;
  127.         })) / _options.NUMBER_OF_TIMES_TO_BENCHMARK;
  128.         if (nWorkers > 2 && results[nWorkers] > results[nWorkers - 1] && results[nWorkers] > results[nWorkers - 2]) {
  129.           workersPerBenchmark = [];
  130.         }
  131.       }
  132.       return runBenchmarks(workersPerBenchmark, results);
  133.     };
  134.     generateResult = function(results) {
  135.       var bestNWorkers, nWorkers, result, smallestTime;
  136.       smallestTime = Infinity;
  137.       bestNWorkers = 0;
  138.       for (nWorkers in results) {
  139.         if (!__hasProp.call(results, nWorkers)) continue;
  140.         result = results[nWorkers];
  141.         if (result < smallestTime) {
  142.           smallestTime = result;
  143.           bestNWorkers = nWorkers;
  144.         }
  145.       }
  146.       return bestNWorkers;
  147.     };
  148.   } else {
  149.     workerBench.init = function() {
  150.       return console.log('WebWorkers are not available.');
  151.     };
  152.   }
  153.   return workerBench;
  154. })();
  155.  
  156. WorkerBench.init();
  157.  
  158. #worker.js
  159. var benchmark;
  160.  
  161. benchmark = function(e) {
  162.   var endTime;
  163.   endTime = Date.now() + e.data.timeout;
  164.   while (Date.now() < endTime) {
  165.     (function() {})();
  166.   }
  167.   return self.postMessage();
  168. };
  169.  
  170. self.addEventListener('message', benchmark);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement