1 |
|
2 |
|
3 |
|
4 | module.exports = bench
|
5 | bench.cpuSpeed = cpuSpeed
|
6 |
|
7 | function bench(tests, next) {
|
8 | var i, tmp
|
9 | , keys = Object.keys(tests).reverse()
|
10 | , len = keys.length
|
11 | , times = []
|
12 | , samples = 7
|
13 |
|
14 |
|
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 |
|
52 | function 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 |
|
68 | function 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 |
|
90 | function cpuSpeed() {
|
91 | for (var i = 1e8, time = Date.now(); i--; );
|
92 | time = Date.now() - time
|
93 | return Math.round(1850 / time) / 10
|
94 | }
|
95 |
|