Advertisement
phenomnomnominal

WorkerBench

Jan 10th, 2013
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #workerBench.coffee
  2. root = exports ? this
  3. root.WorkerBench = ((workerBench = {}) ->
  4.   if Worker? and (typeof Worker is 'function' or typeof Worker is 'object')
  5.     _options = {}
  6.    
  7.     window.performance ?= {}
  8.     performance.now = (->
  9.                          performance.now or
  10.                          performance.webkitNow or
  11.                          performance.msNow or
  12.                          performance.oNow or
  13.                          performance.mozNow or
  14.                          -> Date.now() - (performance.initTime || 0))()
  15.     performance.initTime = performance.now()
  16.    
  17.     workerBench.result = ->
  18.       console.log 'Benchmark not yet complete.'
  19.       false
  20.  
  21.     workerBench.init = (options = {}) ->
  22.       defaultOptions =
  23.         maxWorkersToTestFor: 16
  24.         numberOfTimesToBenchmark: 5
  25.         pathToWorkerScript: 'javascripts/workers'
  26.        
  27.       _initStart =
  28.  
  29.       constant = (key, value) ->
  30.         Object.defineProperty this, key,
  31.           get: -> value
  32.           set: -> throw Error 'Cannot set value of constant!'
  33.      
  34.       constant.call _options, 'MAX_WORKERS_TO_TEST_FOR', options.maxWorkersToTestFor || defaultOptions.maxWorkersToTestFor
  35.       constant.call _options, 'NUMBER_OF_TIMES_TO_BENCHMARK', options.numberOfTimesToBenchmark || defaultOptions.numberOfTimesToBenchmark
  36.       constant.call _options, 'PATH_TO_WORKER_SCRIPT', options.pathToWorkerScript || defaultOptions.pathToWorkerScript
  37.      
  38.       start()
  39.    
  40.     start = ->
  41.       runBenchmarks()
  42.      
  43.     runBenchmarks = (workersPerBenchmark = [1.._options.MAX_WORKERS_TO_TEST_FOR], results = {}) ->
  44.       if workersPerBenchmark.length isnt 0
  45.         runBenchmark workersPerBenchmark, results
  46.       else
  47.         workerBench.result = -> generateResult results
  48.         console.log "Optimum Web Workers: #{workerBench.result()}"
  49.         console.log "Benchmarks took: #{performance.now() - performance.initTime}."
  50.      
  51.     runBenchmark = (workersPerBenchmark, results, finished = [], workers = []) ->
  52.       nWorkers = workersPerBenchmark.shift()
  53.       timeout = 100 / nWorkers
  54.       onMessage = =>
  55.         finished.push "DONE"
  56.         if finished.length is nWorkers
  57.           results[nWorkers] ?= []
  58.           results[nWorkers].push (performance.now() - start)
  59.           worker.terminate() for worker in workers
  60.           finishedBenchmark nWorkers, workersPerBenchmark, results
  61.       start = performance.now()
  62.       for n in [0...nWorkers]
  63.         workers[n] = new Worker("#{_options.PATH_TO_WORKER_SCRIPT}/worker.js")
  64.         workers[n].addEventListener 'message', onMessage
  65.       for n in [0...nWorkers]
  66.         workers[n].postMessage func: 'benchmark', timeout: timeout
  67.        
  68.     finishedBenchmark = (nWorkers, workersPerBenchmark, results) ->
  69.       if results[nWorkers].length < _options.NUMBER_OF_TIMES_TO_BENCHMARK
  70.         workersPerBenchmark.unshift nWorkers
  71.       else
  72.         if _options.NUMBER_OF_TIMES_TO_BENCHMARK > 3
  73.           results[nWorkers].splice(results[nWorkers].indexOf(Math.max.apply(Math, results[nWorkers])), 1)
  74.           results[nWorkers].splice(results[nWorkers].indexOf(Math.min.apply(Math, results[nWorkers])), 1)
  75.         results[nWorkers] = (results[nWorkers].reduce (sum, next) -> sum + next) / _options.NUMBER_OF_TIMES_TO_BENCHMARK
  76.         if nWorkers > 2 and results[nWorkers] > results[nWorkers - 1] and results[nWorkers] > results[nWorkers - 2]
  77.           workersPerBenchmark = []
  78.      
  79.       runBenchmarks workersPerBenchmark, results
  80.      
  81.     generateResult = (results) ->
  82.       smallestTime = Infinity
  83.       bestNWorkers = 0
  84.       for own nWorkers, result of results
  85.         if result < smallestTime
  86.           smallestTime = result
  87.           bestNWorkers = nWorkers
  88.       bestNWorkers
  89.  
  90.   else
  91.     workerBench.init = -> console.log 'WebWorkers are not available.'
  92.    
  93.   workerBench
  94. )()
  95. WorkerBench.init()
  96.  
  97. #worker.coffee
  98. benchmark = (e) ->
  99.   endTime = Date.now() + e.data.timeout
  100.   while Date.now() < endTime
  101.     (->)() #Do nothing
  102.   self.postMessage()
  103.  
  104. self.addEventListener 'message', benchmark
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement