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 | , warmupTime = 0|(2000/len)
|
14 |
|
15 |
|
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 |
|
53 | function 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 |
|
69 | function 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 |
|
91 | function cpuSpeed() {
|
92 | for (var i = 1e8, time = Date.now(); i--; );
|
93 | time = Date.now() - time
|
94 | return Math.round(1850 / time) / 10
|
95 | }
|
96 |
|