wasm-metering
Version:
injects metering into webassembly binaries
100 lines (80 loc) • 2.22 kB
JavaScript
var mutexify = require('mutexify')
var hrtime = require('browser-process-hrtime')
var prettyHrtime = require('pretty-hrtime')
var path = require('path')
var lock = mutexify()
var one = false
var cur = null
var runs = 0
var total = [0, 0]
module.exports = global.__NANOBENCH__ ? require(global.__NANOBENCH__) : benchmark
benchmark.only = function (name, fn) {
if (one) throw new Error('Only a single "only" benchmark can be specified')
one = true
benchmark(name, fn, true)
}
benchmark.skip = function (name, fn) {}
function rawTime (hr) {
return '(' + hr[0] + ' s + ' + hr[1] + ' ns)'
}
function benchmark (name, fn, only) {
process.nextTick(function () {
if (one && !only) return
if (runs === 0) {
console.log('NANOBENCH version 2\n> ' + command() + '\n')
}
runs++
lock(function (release) {
console.log('# ' + name)
var b = cur = {}
var begin = hrtime()
b.start = function () {
begin = hrtime()
}
b.error = function (err) {
cur = null
console.log('fail ' + err.message + '\n')
release()
}
b.log = function (msg) {
console.log('# ' + msg)
}
b.end = function (msg) {
if (msg) b.log(msg)
cur = null
var time = hrtime(begin)
total[0] += time[0]
total[1] += time[1]
while (total[1] >= 1e9) {
total[1] -= 1e9
total[0]++
}
console.log('ok ~' + prettyHrtime(time) + ' ' + rawTime(time) + '\n')
release()
}
fn(b)
})
})
}
process.on('exit', function () {
if (cur) {
cur.error(new Error('bench was never ended'))
console.log('fail\n')
return
}
console.log('all benchmarks completed')
console.log('ok ~' + prettyHrtime(total) + ' ' + rawTime(total) + '\n')
})
function command () {
var argv = process.argv.slice(0)
if (argv[0] === '/usr/local/bin/node') argv[0] = 'node'
if (argv[1] === path.join(__dirname, 'run.js')) {
argv.shift()
argv[0] = 'nanobench'
}
argv = argv.map(function (name) {
var cwd = process.cwd() + path.sep
return name.indexOf(cwd) === 0 ? name.slice(cwd.length) : name
})
return argv.join(' ')
}