1 | var assert = require('assert')
|
2 |
|
3 | var onIdle = require('./lib/on-idle')
|
4 |
|
5 | var perf
|
6 | var disabled = true
|
7 | try {
|
8 | perf = window.performance
|
9 | disabled = window.localStorage.DISABLE_NANOTIMING === 'true' || !perf.mark
|
10 | } catch (e) { }
|
11 |
|
12 | module.exports = nanotiming
|
13 |
|
14 | function nanotiming (name) {
|
15 | assert.equal(typeof name, 'string', 'nanotiming: name should be type string')
|
16 |
|
17 | if (disabled) return noop
|
18 |
|
19 | var uuid = (perf.now() * 10000).toFixed() % Number.MAX_SAFE_INTEGER
|
20 | var startName = 'start-' + uuid + '-' + name
|
21 | perf.mark(startName)
|
22 |
|
23 | function end (cb) {
|
24 | var endName = 'end-' + uuid + '-' + name
|
25 | perf.mark(endName)
|
26 |
|
27 | onIdle(function () {
|
28 | var err = null
|
29 | try {
|
30 | var measureName = name + ' [' + uuid + ']'
|
31 | perf.measure(measureName, startName, endName)
|
32 | perf.clearMarks(startName)
|
33 | perf.clearMarks(endName)
|
34 | } catch (e) { err = e }
|
35 | if (cb) cb(err, name)
|
36 | })
|
37 | }
|
38 |
|
39 | end.uuid = uuid
|
40 | return end
|
41 | }
|
42 |
|
43 | function noop (cb) {
|
44 | if (cb) {
|
45 | onIdle(function () {
|
46 | cb(new Error('nanotiming: performance API unavailable'))
|
47 | })
|
48 | }
|
49 | }
|