UNPKG

1.71 kBJavaScriptView Raw
1
2
3
4module.exports = bench
5bench.cpuSpeed = cpuSpeed
6
7function bench(tests, next) {
8 var i, tmp
9 , keys = Object.keys(tests).reverse()
10 , len = keys.length
11 , times = []
12 , samples = 7
13
14 // warmup
15 for (i = keys.length; i--; ) {
16 measure(tests[keys[i]], 100)
17 times[i] = Array(samples)
18 }
19
20 i = len
21
22 runSync()
23
24 function runSync() {
25 if (i-->0 || samples-->0 && (i = len - 1)) {
26 times[i][samples] = measure(tests[keys[i]], 500)
27 process.nextTick(runSync)
28 } else {
29 respond()
30 }
31 }
32
33 function respond() {
34 var diff, fastest, i, t
35 , result = {}
36 for (i = len; i--; ) {
37 t = result[keys[i]] = stat(times[i])
38 if (!fastest || t.ops > fastest) {
39 fastest = t.ops
40 }
41 }
42 for (i = len; t = result[keys[--i]]; ) {
43 diff = Math.round((fastest - t.ops) / fastest * 100)
44 t.rel = diff ? diff + "% slower" : "fastest"
45 }
46 if (typeof next === "function") {
47 next(null, result)
48 }
49 }
50}
51
52function measure(fn, time, next) {
53 var now, i
54 , calls = 0
55 , end = Date.now() + time
56 , hr = process.hrtime()
57
58 for (; true; ) {
59 for (i = 1000; i--; ) fn()
60 calls++
61 if (Date.now() > end) {
62 hr = process.hrtime(hr)
63 return 1000 * calls / (hr[0] + hr[1]/1e9)
64 }
65 }
66}
67
68function stat(arr) {
69 var i, t
70 , mean = 0
71 , se = 0
72 , len = arr.length
73
74 for (i = len; i--; ) {
75 mean += arr[i]
76 }
77 mean /= len
78 for (i = len; i--; ) {
79 t = arr[i] - mean
80 se += t * t
81 }
82 se = ~~(1000 * (Math.sqrt(se / (len - 1)) / Math.sqrt(len)) / mean) / 10
83 return {
84 ops: mean|0,
85 se: se,
86 text: ((0|mean) + "").replace(/\B(?=(\d{3})+(?!\d))/g, ",") + " ± " + se + "%"
87 }
88}
89
90function cpuSpeed() {
91 for (var i = 1e8, time = Date.now(); i--; );
92 time = Date.now() - time
93 return Math.round(1850 / time) / 10
94}
95