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