const defBench = require('./defBench') // https://github.com/bestiejs/benchmark.js/issues/128 const _ = require('lodash') const each = require('licia/each') const $ = require('licia/$') const isArr = require('licia/isArr') const escape = require('licia/escape') const map = require('licia/map') const process = require('process') const benchmark = require('benchmark') const Benchmark = benchmark.runInContext({ _, process }) window.Benchmark = Benchmark module.exports = function (eruda) { let { evalCss } = eruda.util class BenchmarkTool extends eruda.Tool { constructor() { super() this.name = 'benchmark' this.displayName = 'ベンチマーク' this._style = evalCss(require('./style.scss')) this._benches = [] } init($el, container) { super.init($el, container) this._addDefBench() this._bindEvent() } show() { super.show() } hide() { super.hide() } destroy() { super.destroy() evalCss.remove(this._style) } add(name, fn) { return isArr(fn) ? this._addBenchSuite(name, fn) : this._addBench(name, fn) } _addBenchSuite(name, fns) { let benches = this._benches let self = this let bench = { name, result: null, stores: [], status: 'ready', } let suite = new Benchmark.Suite(name, { onStart() { bench.status = 'running' bench.stores = [] bench.result = null self._render() }, onCycle(e) { if (bench.status === 'error') return bench.stores.push(e.target) bench.result = formatBenches(bench.stores) self._updateResult(bench, bench.result) }, onError(e) { bench.status = 'error' bench.result = e.message.message self._render() }, onAbort() { if (bench.status === 'error') return bench.status = 'abort' self._render() }, onComplete() { if (bench.status === 'error') return bench.status = 'complete' bench.result = formatBenches(bench.stores) self._render() }, }) each(fns, ({ name, fn }) => suite.add(name, fn)) bench.bench = suite benches.push(bench) return this._render() } _addBench(name, fn) { let benches = this._benches let self = this let bench = { bench: new Benchmark(name, fn, { onStart() { bench.status = 'running' bench.result = null self._render() }, onCycle() { if (bench.status === 'error') return bench.result = formatBench(this) self._updateResult(bench, bench.result) }, onError(e) { bench.status = 'error' bench.result = e.message.message self._render() }, onAbort() { if (bench.status === 'error') return bench.status = 'abort' self._render() }, onComplete() { if (bench.status === 'error') return bench.status = 'complete' bench.result = formatBench(this) self._render() }, }), name, result: null, status: 'ready', } benches.push(bench) return this._render() } remove(name) { let benches = this._benches for (let i = benches.length - 1; i >= 0; i--) { if (benches[i].name === name) benches.splice(i, 1) } return this._render() } clear() { this._benches = [] return this._render() } run(name) { let benches = this._benches for (let i = 0, len = benches.length; i < len; i++) { if (benches[i].name === name) this._run(i) } return this } _render() { let benches = this._benches each(benches, (bench) => { bench.isRunning = bench.status === 'running' }) const html = `