1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 |
|
14 | CND = require 'cnd'
|
15 | rpr = CND.rpr
|
16 | badge = 'HOLLERITH-CODEC/benchmarks'
|
17 | log = CND.get_logger 'plain', badge
|
18 | info = CND.get_logger 'info', badge
|
19 | whisper = CND.get_logger 'whisper', badge
|
20 | alert = CND.get_logger 'alert', badge
|
21 | debug = CND.get_logger 'debug', badge
|
22 | warn = CND.get_logger 'warn', badge
|
23 | help = CND.get_logger 'help', badge
|
24 | urge = CND.get_logger 'urge', badge
|
25 | echo = CND.echo.bind CND
|
26 |
|
27 | BYTEWISE = require 'bytewise'
|
28 | CODEC = require './main'
|
29 | CHANCE = new ( require 'chance' )()
|
30 | ƒ = CND.format_number.bind CND
|
31 |
|
32 |
|
33 | times = {}
|
34 |
|
35 |
|
36 | start = ( name ) ->
|
37 | whisper "start #{name}"
|
38 | times[ name ] = process.hrtime()
|
39 | return null
|
40 |
|
41 |
|
42 | stop = ( name ) ->
|
43 | dt = process.hrtime times[ name ]
|
44 | times[ name ] = dt[ 0 ] + dt[ 1 ] / 1e9
|
45 | return null
|
46 |
|
47 |
|
48 | report = ( n, min_name ) ->
|
49 | columnify_settings =
|
50 | config:
|
51 | dt: { align: 'right' }
|
52 | rel: { align: 'right' }
|
53 | max: { align: 'right' }
|
54 | if min_name?
|
55 | min = times[ min_name ]
|
56 | else
|
57 | min = Math.min ( dt for _, dt of times )...
|
58 | max = Math.max ( dt for _, dt of times )...
|
59 | debug '©q6yuS', min, max
|
60 | data = []
|
61 | for name, dt of times
|
62 |
|
63 |
|
64 |
|
65 | entry =
|
66 | name: name
|
67 | dt: ( dt.toFixed 9 )
|
68 | rel: "#{( dt / min ).toFixed 2}"
|
69 | max: "#{( dt / max ).toFixed 2}"
|
70 | data.push entry
|
71 | urge "time needed to process #{ƒ n} probes (lower is better):"
|
72 | help '\n' + CND.columnify data, columnify_settings
|
73 |
|
74 |
|
75 | @test_h2c = ( probes ) ->
|
76 | start 'H2C.encode'
|
77 | CODEC.encode probe for probe in probes
|
78 | stop 'H2C.encode'
|
79 |
|
80 |
|
81 | @test_bytewise = ( probes ) ->
|
82 | start 'bytewise.encode'
|
83 | BYTEWISE.encode probe for probe in probes
|
84 | stop 'bytewise.encode'
|
85 |
|
86 |
|
87 | @test_json = ( probes ) ->
|
88 | start 'new Buffer JSON.stringify'
|
89 | new Buffer JSON.stringify probe for probe in probes
|
90 | stop 'new Buffer JSON.stringify'
|
91 |
|
92 |
|
93 | @test_new_buffer = ( probes ) ->
|
94 | start 'new_buffer'
|
95 | for probe in probes
|
96 | b = new Buffer probe
|
97 | stop 'new_buffer'
|
98 |
|
99 |
|
100 | @test_buffer_write = ( probes ) ->
|
101 | b = new Buffer 1024
|
102 | start 'buffer_write'
|
103 | for probe in probes
|
104 | b.write probe[ 0 ]
|
105 | stop 'buffer_write'
|
106 |
|
107 |
|
108 | @test_string_replace = ( probes ) ->
|
109 | start 'string_replace'
|
110 | for probe in probes
|
111 | x = probe[ 0 ].replace /a/g, '#'
|
112 | stop 'string_replace'
|
113 |
|
114 |
|
115 | @main = ->
|
116 | n = 100000
|
117 | whisper "generating #{ƒ n} probes"
|
118 | method_names = [ 'bool', 'word', 'floating', 'string', ]
|
119 | probes = []
|
120 | for probe_idx in [ 1 .. n ]
|
121 | probe = []
|
122 | for _ in [ 0 .. 3 ]
|
123 | method_name = method_names[ CND.random_integer 0, method_names.length - 1 ]
|
124 | probe.push CHANCE[ method_name ]()
|
125 | probes.push probe
|
126 |
|
127 | help "generated #{ƒ probes.length} probes; now performing benchmarks"
|
128 | @test_bytewise probes
|
129 | @test_json probes
|
130 | @test_h2c probes
|
131 |
|
132 |
|
133 |
|
134 | report n, 'new Buffer JSON.stringify'
|
135 |
|
136 |
|
137 |
|
138 | unless module.parent?
|
139 | @main()
|
140 |
|
141 |
|
142 |
|
143 |
|
144 |
|
145 |
|
146 |
|
147 |
|
148 |
|
149 |
|
150 |
|