UNPKG

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