Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #workerBench.coffee
- root = exports ? this
- root.WorkerBench = ((workerBench = {}) ->
- if Worker? and (typeof Worker is 'function' or typeof Worker is 'object')
- _options = {}
- window.performance ?= {}
- performance.now = (->
- performance.now or
- performance.webkitNow or
- performance.msNow or
- performance.oNow or
- performance.mozNow or
- -> Date.now() - (performance.initTime || 0))()
- performance.initTime = performance.now()
- workerBench.result = ->
- console.log 'Benchmark not yet complete.'
- false
- workerBench.init = (options = {}) ->
- defaultOptions =
- maxWorkersToTestFor: 16
- numberOfTimesToBenchmark: 5
- pathToWorkerScript: 'javascripts/workers'
- _initStart =
- constant = (key, value) ->
- Object.defineProperty this, key,
- get: -> value
- set: -> throw Error 'Cannot set value of constant!'
- constant.call _options, 'MAX_WORKERS_TO_TEST_FOR', options.maxWorkersToTestFor || defaultOptions.maxWorkersToTestFor
- constant.call _options, 'NUMBER_OF_TIMES_TO_BENCHMARK', options.numberOfTimesToBenchmark || defaultOptions.numberOfTimesToBenchmark
- constant.call _options, 'PATH_TO_WORKER_SCRIPT', options.pathToWorkerScript || defaultOptions.pathToWorkerScript
- start()
- start = ->
- runBenchmarks()
- runBenchmarks = (workersPerBenchmark = [1.._options.MAX_WORKERS_TO_TEST_FOR], results = {}) ->
- if workersPerBenchmark.length isnt 0
- runBenchmark workersPerBenchmark, results
- else
- workerBench.result = -> generateResult results
- console.log "Optimum Web Workers: #{workerBench.result()}"
- console.log "Benchmarks took: #{performance.now() - performance.initTime}."
- runBenchmark = (workersPerBenchmark, results, finished = [], workers = []) ->
- nWorkers = workersPerBenchmark.shift()
- timeout = 100 / nWorkers
- onMessage = =>
- finished.push "DONE"
- if finished.length is nWorkers
- results[nWorkers] ?= []
- results[nWorkers].push (performance.now() - start)
- worker.terminate() for worker in workers
- finishedBenchmark nWorkers, workersPerBenchmark, results
- start = performance.now()
- for n in [0...nWorkers]
- workers[n] = new Worker("#{_options.PATH_TO_WORKER_SCRIPT}/worker.js")
- workers[n].addEventListener 'message', onMessage
- for n in [0...nWorkers]
- workers[n].postMessage func: 'benchmark', timeout: timeout
- finishedBenchmark = (nWorkers, workersPerBenchmark, results) ->
- if results[nWorkers].length < _options.NUMBER_OF_TIMES_TO_BENCHMARK
- workersPerBenchmark.unshift nWorkers
- else
- if _options.NUMBER_OF_TIMES_TO_BENCHMARK > 3
- results[nWorkers].splice(results[nWorkers].indexOf(Math.max.apply(Math, results[nWorkers])), 1)
- results[nWorkers].splice(results[nWorkers].indexOf(Math.min.apply(Math, results[nWorkers])), 1)
- results[nWorkers] = (results[nWorkers].reduce (sum, next) -> sum + next) / _options.NUMBER_OF_TIMES_TO_BENCHMARK
- if nWorkers > 2 and results[nWorkers] > results[nWorkers - 1] and results[nWorkers] > results[nWorkers - 2]
- workersPerBenchmark = []
- runBenchmarks workersPerBenchmark, results
- generateResult = (results) ->
- smallestTime = Infinity
- bestNWorkers = 0
- for own nWorkers, result of results
- if result < smallestTime
- smallestTime = result
- bestNWorkers = nWorkers
- bestNWorkers
- else
- workerBench.init = -> console.log 'WebWorkers are not available.'
- workerBench
- )()
- WorkerBench.init()
- #worker.coffee
- benchmark = (e) ->
- endTime = Date.now() + e.data.timeout
- while Date.now() < endTime
- (->)() #Do nothing
- self.postMessage()
- self.addEventListener 'message', benchmark
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement