Skip to content

Commit f532df6

Browse files
authored
Merge pull request #18 from lpgauth/upkeep/rework-bench-page
Rework benchmark page
2 parents 57ef46f + 279529d commit f532df6

4 files changed

Lines changed: 266 additions & 244 deletions

File tree

README.md

Lines changed: 43 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -161,68 +161,66 @@ Functions return `{:error, reason}` tuples (or raise `ArgumentError` for bang/io
161161

162162
Apple M2 Pro, OTP 28, Elixir 1.19:
163163

164-
### Decode (1.2 KB JSON)
164+
### Decode (1.2 KB OpenRTB)
165165

166166
| Library | ips | mean | median | p99 | memory |
167167
|---|---|---|---|---|---|
168-
| torque | **271.9K** | **3.68 μs** | **3.54 μs** | **6.54 μs** | **1.56 KB** |
169-
| simdjsone | 188.9K | 5.29 μs | 5.00 μs | 9.63 μs | 1.59 KB |
170-
| jiffy | 152.4K | 6.56 μs | 5.79 μs | 15.79 μs | **1.56 KB** |
171-
| otp json | 135.0K | 7.41 μs | 7.04 μs | 13.54 μs | 7.73 KB |
172-
| jason | 106.6K | 9.38 μs | 8.54 μs | 21.75 μs | 9.54 KB |
168+
| **torque** | **257.2K** | **3.89 μs** | **3.67 μs** | **8.17 μs** | **1.56 KB** |
169+
| **simdjsone** | 170.0K | 5.88 μs | 5.13 μs | 14.75 μs | 1.59 KB |
170+
| **jiffy** | 146.1K | 6.85 μs | 6.00 μs | 17.08 μs | **1.56 KB** |
171+
| **otp json** | 127.2K | 7.86 μs | 7.29 μs | 18.00 μs | 7.73 KB |
172+
| **jason** | 107.7K | 9.29 μs | 8.71 μs | 18.08 μs | 9.54 KB |
173173

174-
### Decode (750 KB JSON)
174+
### Decode (750 KB Twitter)
175175

176176
| Library | ips | mean | median | p99 | memory |
177177
|---|---|---|---|---|---|
178-
| torque | **513.5** | **1.95 ms** | **1.80 ms** | **2.51 ms** | **1.56 KB** |
179-
| simdjsone | 448.9 | 2.23 ms | 1.89 ms | 3.33 ms | **1.56 KB** |
180-
| otp json | 191.5 | 5.22 ms | 5.20 ms | 6.15 ms | 2.49 MB |
181-
| jason | 142.2 | 7.03 ms | 7.01 ms | 7.70 ms | 3.55 MB |
182-
| jiffy | 112.4 | 8.90 ms | 8.92 ms | 10.00 ms | 5.53 MB |
178+
| **torque** | **505.0** | **1.98 ms** | **1.82 ms** | **2.58 ms** | **1.56 KB** |
179+
| **simdjsone** | 415.3 | 2.41 ms | 1.90 ms | 3.82 ms | **1.56 KB** |
180+
| **otp json** | 182.5 | 5.48 ms | 5.45 ms | 6.58 ms | 2.49 MB |
181+
| **jason** | 136.8 | 7.31 ms | 7.13 ms | 12.29 ms | 3.55 MB |
182+
| **jiffy** | 100.7 | 9.93 ms | 10.01 ms | 11.91 ms | 5.53 MB |
183183

184-
### Encode (1.2 KB JSON)
184+
### Encode (1.2 KB OpenRTB)
185185

186186
| Library | ips | mean | median | p99 | memory |
187187
|---|---|---|---|---|---|
188-
| torque: proplist => binary | **1243.5K** | **0.80 μs** | **0.71 μs** | **1.00 μs** | 88 B |
189-
| torque: proplist => iodata | 1242.6K | 0.80 μs | **0.71 μs** | **1.00 μs** | **64 B** |
190-
| torque: map => iodata | 1046.0K | 0.96 μs | 0.88 μs | 1.17 μs | **64 B** |
191-
| torque: map => binary | 1044.8K | 0.96 μs | 0.88 μs | 1.17 μs | 88 B |
192-
| otp json: map => iodata | 943.3K | 1.06 μs | 0.83 μs | 10.37 μs | 3928 B |
193-
| jason: map => iodata | 625.3K | 1.60 μs | 1.50 μs | 2.63 μs | 3848 B |
194-
| jiffy: proplist => iodata | 563.3K | 1.78 μs | 1.50 μs | 3.83 μs | 120 B |
195-
| otp json: map => binary | 559.1K | 1.79 μs | 1.54 μs | 5.13 μs | 3992 B |
196-
| jiffy: map => iodata | 493.5K | 2.03 μs | 1.83 μs | 2.54 μs | 824 B |
197-
| simdjsone: proplist => iodata | 458.1K | 2.18 μs | 2.04 μs | 2.71 μs | 184 B |
198-
| jason: map => binary | 384.3K | 2.60 μs | 2.38 μs | 6.04 μs | 3912 B |
199-
| simdjsone: map => iodata | 379.8K | 2.63 μs | 2.38 μs | 5.79 μs | 888 B |
200-
201-
### Encode (750 KB JSON)
188+
| **torque** [proplist() :: binary()] | **1274.3K** | **0.78 μs** | **0.71 μs** | **0.92 μs** | 88 B |
189+
| **torque** [proplist() :: iodata()] | 1261.4K | 0.79 μs | **0.71 μs** | 0.96 μs | **64 B** |
190+
| **otp json** [map() :: iodata()] | 1078.0K | 0.93 μs | 0.88 μs | 1.38 μs | 3928 B |
191+
| **torque** [map() :: iodata()] | 1064.8K | 0.94 μs | 0.88 μs | 1.13 μs | **64 B** |
192+
| **torque** [map() :: binary()] | 1053.1K | 0.95 μs | 0.88 μs | 1.17 μs | 88 B |
193+
| **jason** [map() :: iodata()] | 591.3K | 1.69 μs | 1.50 μs | 3.54 μs | 3848 B |
194+
| **jiffy** [proplist() :: iodata()] | 579.2K | 1.73 μs | 1.50 μs | 2.13 μs | 120 B |
195+
| **jiffy** [map() :: iodata()] | 498.1K | 2.01 μs | 1.83 μs | 2.50 μs | 824 B |
196+
| **simdjsone** [proplist() :: iodata()] | 441.6K | 2.26 μs | 2.00 μs | 3.71 μs | 184 B |
197+
| **jason** [map() :: binary()] | 399.7K | 2.50 μs | 2.33 μs | 4.21 μs | 3912 B |
198+
| **simdjsone** [map() :: iodata()] | 386.7K | 2.59 μs | 2.38 μs | 4.54 μs | 888 B |
199+
200+
### Encode (750 KB Twitter)
202201

203202
| Library | ips | mean | median | p99 | memory |
204203
|---|---|---|---|---|---|
205-
| torque: proplist => iodata | **1280.9** | **0.78 ms** | **0.76 ms** | **0.96 ms** | **64 B** |
206-
| torque: proplist => binary | 1270.8 | 0.79 ms | **0.76 ms** | 1.01 ms | 88 B |
207-
| torque: map => iodata | 1109.3 | 0.90 ms | 0.89 ms | 1.10 ms | **64 B** |
208-
| torque: map => binary | 1078.4 | 0.93 ms | 0.90 ms | 1.46 ms | 88 B |
209-
| jiffy: proplist => iodata | 329.1 | 3.04 ms | 2.78 ms | 7.86 ms | 37.7 KB |
210-
| jiffy: map => iodata | 285.8 | 3.50 ms | 3.56 ms | 4.18 ms | 1.06 MB |
211-
| otp json: map => iodata | 263.5 | 3.80 ms | 3.97 ms | 4.91 ms | 5.40 MB |
212-
| simdjsone: proplist => iodata | 257.8 | 3.88 ms | 3.79 ms | 6.54 ms | 37.7 KB |
213-
| jason: map => iodata | 255.5 | 3.91 ms | 3.74 ms | 6.04 ms | 4.96 MB |
214-
| simdjsone: map => iodata | 225.3 | 4.44 ms | 4.31 ms | 5.34 ms | 1.06 MB |
215-
| otp json: map => binary | 180.1 | 5.55 ms | 5.58 ms | 13.46 ms | 5.40 MB |
216-
| jason: map => binary | 141.4 | 7.07 ms | 7.03 ms | 7.94 ms | 4.96 MB |
217-
218-
### Parse + Get (1.2 KB JSON)
204+
| **torque** [proplist() :: iodata()] | **1272.5** | **0.79 ms** | **0.76 ms** | **0.99 ms** | **64 B** |
205+
| **torque** [proplist() :: binary()] | 1252.1 | 0.80 ms | 0.77 ms | 1.04 ms | 88 B |
206+
| **torque** [map() :: iodata()] | 1102.9 | 0.91 ms | 0.89 ms | 1.09 ms | **64 B** |
207+
| **torque** [map() :: binary()] | 1084.0 | 0.92 ms | 0.89 ms | 1.20 ms | 88 B |
208+
| **jiffy** [proplist() :: iodata()] | 342.0 | 2.92 ms | 2.82 ms | 4.75 ms | 37.7 KB |
209+
| **jiffy** [map() :: iodata()] | 287.1 | 3.48 ms | 3.32 ms | 4.29 ms | 1.06 MB |
210+
| **simdjsone** [proplist() :: iodata()] | 259.7 | 3.85 ms | 3.78 ms | 5.79 ms | 37.7 KB |
211+
| **jason** [map() :: iodata()] | 241.3 | 4.14 ms | 3.94 ms | 6.99 ms | 4.96 MB |
212+
| **simdjsone** [map() :: iodata()] | 216.1 | 4.63 ms | 4.66 ms | 6.51 ms | 1.06 MB |
213+
| **otp json** [map() :: iodata()] | 200.2 | 4.99 ms | 5.10 ms | 6.97 ms | 5.40 MB |
214+
| **jason** [map() :: binary()] | 130.9 | 7.64 ms | 7.53 ms | 9.09 ms | 4.96 MB |
215+
216+
### Parse + Get (5 fields) (1.2 KB OpenRTB)
219217

220218
| Library | ips | mean | median | p99 | memory |
221219
|---|---|---|---|---|---|
222-
| torque parse+get_many_nil | **478.4K** | **2.09 μs** | **1.75 μs** | **4.83 μs** | **288 B** |
223-
| torque parse+get_many | 471.8K | 2.12 μs | 1.75 μs | 4.83 μs | 408 B |
224-
| torque parse+get | 445.9K | 2.24 μs | 1.96 μs | 5.88 μs | 432 B |
225-
| simdjsone parse+get | 445.5K | 2.24 μs | 1.67 μs | 5.17 μs | 408 B |
220+
| **torque** parse+get_many_nil | **455.8K** | **2.19 μs** | **1.75 μs** | **6.21 μs** | **288 B** |
221+
| **torque** parse+get_many | 431.6K | 2.32 μs | 1.75 μs | 6.33 μs | 408 B |
222+
| **torque** parse+get | 415.5K | 2.41 μs | 1.96 μs | 7.13 μs | 432 B |
223+
| **simdjsone** parse+get | 353.8K | 2.83 μs | 1.71 μs | 7.25 μs | 408 B |
226224

227225
Run benchmarks locally:
228226

bench/index.html

Lines changed: 32 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,24 @@ <h2>Performance Over Time</h2>
146146
data.commit + '</a>' +
147147
' (' + new Date(data.date).toLocaleDateString() + ')';
148148

149-
// group by benchmark group, preserving order
150-
var groups = {}, order = [];
149+
var GROUP_ORDER = [
150+
'Encode — 1.2 KB OpenRTB',
151+
'Encode — 750 KB Twitter',
152+
'Decode — 1.2 KB OpenRTB',
153+
'Decode — 750 KB Twitter',
154+
'Parse+Get (5 fields) — 1.2 KB OpenRTB'
155+
];
156+
157+
// group by benchmark group, sorted by GROUP_ORDER
158+
var groups = {};
151159
data.results.forEach(function (r) {
152-
if (!groups[r.group]) { groups[r.group] = []; order.push(r.group); }
153-
groups[r.group].push(r);
160+
var g = r.group;
161+
if (!groups[g]) { groups[g] = []; }
162+
groups[g].push(r);
163+
});
164+
var order = GROUP_ORDER.filter(function (g) { return groups[g]; });
165+
Object.keys(groups).forEach(function (g) {
166+
if (order.indexOf(g) === -1) order.push(g);
154167
});
155168

156169
container.innerHTML = '';
@@ -213,14 +226,26 @@ <h2>Performance Over Time</h2>
213226
var latest = entries[entries.length - 1].benches;
214227
var metricNames = latest.map(function (b) { return b.name; });
215228

216-
// group by type + payload
217-
var groups = {}, order = [];
229+
var TREND_ORDER = [
230+
'Encode \u2014 1.2 KB OpenRTB',
231+
'Encode \u2014 750 KB Twitter',
232+
'Decode \u2014 1.2 KB OpenRTB',
233+
'Decode \u2014 750 KB Twitter',
234+
'Parse+Get \u2014 1.2 KB OpenRTB'
235+
];
236+
237+
// group by type + payload, sorted by TREND_ORDER
238+
var groups = {};
218239
metricNames.forEach(function (name) {
219240
var cls = classifyMetric(name);
220241
var key = cls.type + ' \u2014 ' + cls.payload;
221-
if (!groups[key]) { groups[key] = []; order.push(key); }
242+
if (!groups[key]) { groups[key] = []; }
222243
groups[key].push({ name: name, variant: cls.variant });
223244
});
245+
var order = TREND_ORDER.filter(function (g) { return groups[g]; });
246+
Object.keys(groups).forEach(function (g) {
247+
if (order.indexOf(g) === -1) order.push(g);
248+
});
224249

225250
container.innerHTML = '';
226251
order.forEach(function (groupName, gi) {

0 commit comments

Comments
 (0)