radius-spec 0.5.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,455 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Run from the command line: bundle exec ruby benchmarks/hash_merge.rb
4
+ require_relative 'bm_setup'
5
+
6
+ display_benchmark_header
7
+
8
+ # rubocop:disable Style/HashTransformKeys
9
+ # Bad per Rubocop
10
+ def hash_transform_key_each_with_object(hash)
11
+ hash.each_with_object({}) { |(k, v), h| h[k + 100] = v }
12
+ end
13
+
14
+ # Bad per Rubocop
15
+ def hash_transform_key_hash_collect(hash)
16
+ Hash[hash.collect { |k, v| [k + 100, v] }]
17
+ end
18
+
19
+ # Bad per Rubocop
20
+ def hash_transform_key_map_to_h(hash)
21
+ hash.map { |k, v| [k + 100, v] }.to_h
22
+ end
23
+
24
+ # Bad per Rubocop
25
+ def hash_transform_key_to_h_block(hash)
26
+ hash.to_h { |k, v| [k + 100, v] }
27
+ end
28
+
29
+ # Good per Rubocop
30
+ def hash_transform_keys(hash)
31
+ hash.transform_keys { |k| k + 100 }
32
+ end
33
+ # rubocop:enable Style/HashTransformKeys
34
+
35
+ [
36
+ [],
37
+ (1..5),
38
+ (1..10),
39
+ (1..20),
40
+ (1..100),
41
+ (1..500),
42
+ ].each do |data|
43
+ test_hash = data.zip(data).to_h
44
+
45
+ section "Hash transform keys (size=#{data.size})" do |bench|
46
+ bench.report("each_with_object") do
47
+ hash_transform_key_each_with_object(test_hash)
48
+ end
49
+
50
+ bench.report("collect.Hash") do
51
+ hash_transform_key_hash_collect(test_hash)
52
+ end
53
+
54
+ bench.report("map.to_h") do
55
+ hash_transform_key_map_to_h(test_hash)
56
+ end
57
+
58
+ bench.report("to_h block") do
59
+ hash_transform_key_to_h_block(test_hash)
60
+ end
61
+
62
+ bench.report("transform_keys") do
63
+ hash_transform_keys(test_hash)
64
+ end
65
+ end
66
+ end
67
+
68
+ # rubocop:disable Style/HashTransformValues
69
+ # Bad per Rubocop
70
+ def hash_transform_value_each_with_object(hash)
71
+ hash.each_with_object({}) { |(k, v), h| h[k] = v + 100 }
72
+ end
73
+
74
+ # Bad per Rubocop
75
+ def hash_transform_value_hash_collect(hash)
76
+ Hash[hash.collect { |k, v| [k, v + 100] }]
77
+ end
78
+
79
+ # Bad per Rubocop
80
+ def hash_transform_value_map_to_h(hash)
81
+ hash.map { |k, v| [k, v + 100] }.to_h
82
+ end
83
+
84
+ # Bad per Rubocop
85
+ def hash_transform_value_to_h_block(hash)
86
+ hash.to_h { |k, v| [k, v + 100] }
87
+ end
88
+
89
+ # Good per Rubocop
90
+ def hash_transform_values(hash)
91
+ hash.transform_values { |v| v + 100 }
92
+ end
93
+ # rubocop:enable Style/HashTransformValues
94
+
95
+ [
96
+ [],
97
+ (1..5),
98
+ (1..10),
99
+ (1..20),
100
+ (1..100),
101
+ (1..500),
102
+ ].each do |data|
103
+ test_hash = data.zip(data).to_h
104
+
105
+ section "Hash value enumeration (size=#{data.size})" do |bench|
106
+ bench.report("each_with_object") do
107
+ hash_transform_value_each_with_object(test_hash)
108
+ end
109
+
110
+ bench.report("collect.Hash") do
111
+ hash_transform_value_hash_collect(test_hash)
112
+ end
113
+
114
+ bench.report("map.to_h") do
115
+ hash_transform_value_map_to_h(test_hash)
116
+ end
117
+
118
+ bench.report("to_h block") do
119
+ hash_transform_value_to_h_block(test_hash)
120
+ end
121
+
122
+ bench.report("transform_values") do
123
+ hash_transform_values(test_hash)
124
+ end
125
+ end
126
+ end
127
+
128
+ __END__
129
+
130
+ ### Environment
131
+
132
+ Heroku Performance-L Dyno
133
+
134
+ ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-linux]
135
+ GC Disabled: false
136
+
137
+ ### Test Cases
138
+
139
+ These benchmarks confirm that regardless of the size of the hash, the
140
+ `transform_xyz` variants are much faster than the alternatives. It's
141
+ interesting to note that the performance difference for some of the variants
142
+ decreases as the hash size increases. However, even with the largest hash the
143
+ `transform_xyz` version is significantly faster.
144
+
145
+ #### Hash transform keys (size=0)
146
+
147
+ ```
148
+ Warming up --------------------------------------
149
+ each_with_object 538.673k i/100ms
150
+ collect.Hash 342.897k i/100ms
151
+ map.to_h 426.927k i/100ms
152
+ to_h block 1.043M i/100ms
153
+ transform_keys 1.083M i/100ms
154
+ Calculating -------------------------------------
155
+ each_with_object 5.396M (± 0.0%) i/s - 27.472M in 5.091587s
156
+ collect.Hash 3.434M (± 0.0%) i/s - 17.488M in 5.093257s
157
+ map.to_h 4.263M (± 0.0%) i/s - 21.346M in 5.007195s
158
+ to_h block 10.431M (± 0.0%) i/s - 52.164M in 5.000982s
159
+ transform_keys 10.821M (± 0.0%) i/s - 54.133M in 5.002821s
160
+ with 95.0% confidence
161
+
162
+ Comparison:
163
+ transform_keys: 10820597.2 i/s
164
+ to_h block: 10430816.6 i/s - 1.04x (± 0.00) slower
165
+ each_with_object: 5395639.2 i/s - 2.01x (± 0.00) slower
166
+ map.to_h: 4263178.7 i/s - 2.54x (± 0.00) slower
167
+ collect.Hash: 3433510.5 i/s - 3.15x (± 0.00) slower
168
+ with 95.0% confidence
169
+ ```
170
+
171
+ #### Hash transform keys (size=5)
172
+
173
+ ```
174
+ Warming up --------------------------------------
175
+ each_with_object 101.033k i/100ms
176
+ collect.Hash 91.559k i/100ms
177
+ map.to_h 97.138k i/100ms
178
+ to_h block 144.964k i/100ms
179
+ transform_keys 236.915k i/100ms
180
+ Calculating -------------------------------------
181
+ each_with_object 1.009M (± 0.0%) i/s - 5.052M in 5.008941s
182
+ collect.Hash 914.359k (± 0.2%) i/s - 4.578M in 5.007666s
183
+ map.to_h 968.789k (± 0.0%) i/s - 4.857M in 5.013387s
184
+ to_h block 1.452M (± 0.0%) i/s - 7.393M in 5.091421s
185
+ transform_keys 2.371M (± 0.1%) i/s - 12.083M in 5.096820s
186
+ with 95.0% confidence
187
+
188
+ Comparison:
189
+ transform_keys: 2370806.9 i/s
190
+ to_h block: 1452082.9 i/s - 1.63x (± 0.00) slower
191
+ each_with_object: 1008530.1 i/s - 2.35x (± 0.00) slower
192
+ map.to_h: 968788.7 i/s - 2.45x (± 0.00) slower
193
+ collect.Hash: 914358.6 i/s - 2.59x (± 0.01) slower
194
+ with 95.0% confidence
195
+ ```
196
+
197
+ #### Hash transform keys (size=10)
198
+
199
+ ```
200
+ Warming up --------------------------------------
201
+ each_with_object 48.415k i/100ms
202
+ collect.Hash 49.273k i/100ms
203
+ map.to_h 54.155k i/100ms
204
+ to_h block 72.567k i/100ms
205
+ transform_keys 99.649k i/100ms
206
+ Calculating -------------------------------------
207
+ each_with_object 438.801k (± 0.2%) i/s - 2.227M in 5.075718s
208
+ collect.Hash 493.563k (± 0.1%) i/s - 2.513M in 5.091711s
209
+ map.to_h 550.742k (± 0.0%) i/s - 2.762M in 5.014922s
210
+ to_h block 725.526k (± 0.0%) i/s - 3.628M in 5.001047s
211
+ transform_keys 997.743k (± 0.4%) i/s - 5.082M in 5.094699s
212
+ with 95.0% confidence
213
+
214
+ Comparison:
215
+ transform_keys: 997742.9 i/s
216
+ to_h block: 725525.6 i/s - 1.38x (± 0.00) slower
217
+ map.to_h: 550741.9 i/s - 1.81x (± 0.01) slower
218
+ collect.Hash: 493562.5 i/s - 2.02x (± 0.01) slower
219
+ each_with_object: 438801.5 i/s - 2.27x (± 0.01) slower
220
+ with 95.0% confidence
221
+ ```
222
+
223
+ #### Hash transform keys (size=20)
224
+
225
+ ```
226
+ Warming up --------------------------------------
227
+ each_with_object 27.891k i/100ms
228
+ collect.Hash 30.118k i/100ms
229
+ map.to_h 31.586k i/100ms
230
+ to_h block 41.472k i/100ms
231
+ transform_keys 56.874k i/100ms
232
+ Calculating -------------------------------------
233
+ each_with_object 259.309k (± 0.2%) i/s - 1.311M in 5.055247s
234
+ collect.Hash 301.677k (± 0.0%) i/s - 1.536M in 5.091598s
235
+ map.to_h 316.764k (± 0.0%) i/s - 1.611M in 5.085459s
236
+ to_h block 416.878k (± 0.0%) i/s - 2.115M in 5.073771s
237
+ transform_keys 566.454k (± 0.4%) i/s - 2.844M in 5.021314s
238
+ with 95.0% confidence
239
+
240
+ Comparison:
241
+ transform_keys: 566453.6 i/s
242
+ to_h block: 416877.9 i/s - 1.36x (± 0.01) slower
243
+ map.to_h: 316763.9 i/s - 1.79x (± 0.01) slower
244
+ collect.Hash: 301677.3 i/s - 1.88x (± 0.01) slower
245
+ each_with_object: 259308.7 i/s - 2.18x (± 0.01) slower
246
+ with 95.0% confidence
247
+ ```
248
+
249
+ #### Hash transform keys (size=100)
250
+
251
+ ```
252
+ Warming up --------------------------------------
253
+ each_with_object 6.252k i/100ms
254
+ collect.Hash 6.684k i/100ms
255
+ map.to_h 7.193k i/100ms
256
+ to_h block 9.181k i/100ms
257
+ transform_keys 12.110k i/100ms
258
+ Calculating -------------------------------------
259
+ each_with_object 62.523k (± 0.0%) i/s - 318.852k in 5.099821s
260
+ collect.Hash 66.729k (± 0.0%) i/s - 334.200k in 5.008308s
261
+ map.to_h 71.711k (± 0.0%) i/s - 359.650k in 5.015342s
262
+ to_h block 91.347k (± 0.0%) i/s - 459.050k in 5.025450s
263
+ transform_keys 122.210k (± 0.1%) i/s - 617.610k in 5.053842s
264
+ with 95.0% confidence
265
+
266
+ Comparison:
267
+ transform_keys: 122210.0 i/s
268
+ to_h block: 91347.2 i/s - 1.34x (± 0.00) slower
269
+ map.to_h: 71710.5 i/s - 1.70x (± 0.00) slower
270
+ collect.Hash: 66729.5 i/s - 1.83x (± 0.00) slower
271
+ each_with_object: 62522.6 i/s - 1.95x (± 0.00) slower
272
+ with 95.0% confidence
273
+ ```
274
+
275
+ #### Hash transform keys (size=500)
276
+
277
+ ```
278
+ Warming up --------------------------------------
279
+ each_with_object 1.309k i/100ms
280
+ collect.Hash 1.397k i/100ms
281
+ map.to_h 1.501k i/100ms
282
+ to_h block 1.881k i/100ms
283
+ transform_keys 2.564k i/100ms
284
+ Calculating -------------------------------------
285
+ each_with_object 13.113k (± 0.1%) i/s - 66.759k in 5.090832s
286
+ collect.Hash 13.971k (± 0.1%) i/s - 69.850k in 5.000147s
287
+ map.to_h 14.983k (± 0.0%) i/s - 75.050k in 5.009121s
288
+ to_h block 18.827k (± 0.0%) i/s - 95.931k in 5.095314s
289
+ transform_keys 26.712k (± 0.8%) i/s - 135.892k in 5.092990s
290
+ with 95.0% confidence
291
+
292
+ Comparison:
293
+ transform_keys: 26711.7 i/s
294
+ to_h block: 18827.4 i/s - 1.42x (± 0.01) slower
295
+ map.to_h: 14982.9 i/s - 1.78x (± 0.01) slower
296
+ collect.Hash: 13970.7 i/s - 1.91x (± 0.02) slower
297
+ each_with_object: 13113.5 i/s - 2.04x (± 0.02) slower
298
+ with 95.0% confidence
299
+ ```
300
+
301
+ #### Hash value enumeration (size=0)
302
+
303
+ ```
304
+ Warming up --------------------------------------
305
+ each_with_object 536.283k i/100ms
306
+ collect.Hash 343.935k i/100ms
307
+ map.to_h 412.861k i/100ms
308
+ to_h block 1.006M i/100ms
309
+ transform_values 1.034M i/100ms
310
+ Calculating -------------------------------------
311
+ each_with_object 5.354M (± 0.3%) i/s - 26.814M in 5.009608s
312
+ collect.Hash 3.438M (± 0.0%) i/s - 17.197M in 5.001856s
313
+ map.to_h 4.129M (± 0.0%) i/s - 20.643M in 4.999982s
314
+ to_h block 9.850M (± 0.0%) i/s - 49.315M in 5.006595s
315
+ transform_values 10.253M (± 0.0%) i/s - 51.721M in 5.044573s
316
+ with 95.0% confidence
317
+
318
+ Comparison:
319
+ transform_values: 10252746.8 i/s
320
+ to_h block: 9850031.5 i/s - 1.04x (± 0.00) slower
321
+ each_with_object: 5353850.7 i/s - 1.92x (± 0.01) slower
322
+ map.to_h: 4128725.3 i/s - 2.48x (± 0.00) slower
323
+ collect.Hash: 3438102.9 i/s - 2.98x (± 0.00) slower
324
+ with 95.0% confidence
325
+ ```
326
+
327
+ #### Hash value enumeration (size=5)
328
+
329
+ ```
330
+ Warming up --------------------------------------
331
+ each_with_object 101.174k i/100ms
332
+ collect.Hash 91.846k i/100ms
333
+ map.to_h 96.742k i/100ms
334
+ to_h block 144.714k i/100ms
335
+ transform_values 334.829k i/100ms
336
+ Calculating -------------------------------------
337
+ each_with_object 1.011M (± 0.0%) i/s - 5.059M in 5.002511s
338
+ collect.Hash 916.962k (± 0.0%) i/s - 4.592M in 5.008221s
339
+ map.to_h 969.007k (± 0.0%) i/s - 4.934M in 5.091657s
340
+ to_h block 1.447M (± 0.0%) i/s - 7.236M in 5.000091s
341
+ transform_values 3.356M (± 0.1%) i/s - 17.076M in 5.089207s
342
+ with 95.0% confidence
343
+
344
+ Comparison:
345
+ transform_values: 3355662.6 i/s
346
+ to_h block: 1447114.5 i/s - 2.32x (± 0.00) slower
347
+ each_with_object: 1011242.1 i/s - 3.32x (± 0.00) slower
348
+ map.to_h: 969007.2 i/s - 3.46x (± 0.00) slower
349
+ collect.Hash: 916962.3 i/s - 3.66x (± 0.00) slower
350
+ with 95.0% confidence
351
+ ```
352
+
353
+ #### Hash value enumeration (size=10)
354
+
355
+ ```
356
+ Warming up --------------------------------------
357
+ each_with_object 48.473k i/100ms
358
+ collect.Hash 49.061k i/100ms
359
+ map.to_h 53.340k i/100ms
360
+ to_h block 72.241k i/100ms
361
+ transform_values 146.939k i/100ms
362
+ Calculating -------------------------------------
363
+ each_with_object 480.559k (± 0.1%) i/s - 2.424M in 5.043419s
364
+ collect.Hash 492.989k (± 0.0%) i/s - 2.502M in 5.075419s
365
+ map.to_h 546.714k (± 0.0%) i/s - 2.774M in 5.073369s
366
+ to_h block 725.482k (± 0.0%) i/s - 3.684M in 5.078410s
367
+ transform_values 1.575M (± 0.2%) i/s - 7.935M in 5.036956s
368
+ with 95.0% confidence
369
+
370
+ Comparison:
371
+ transform_values: 1575397.1 i/s
372
+ to_h block: 725482.0 i/s - 2.17x (± 0.00) slower
373
+ map.to_h: 546714.4 i/s - 2.88x (± 0.00) slower
374
+ collect.Hash: 492988.8 i/s - 3.20x (± 0.01) slower
375
+ each_with_object: 480559.2 i/s - 3.28x (± 0.01) slower
376
+ with 95.0% confidence
377
+ ```
378
+
379
+ #### Hash value enumeration (size=20)
380
+
381
+ ```
382
+ Warming up --------------------------------------
383
+ each_with_object 28.320k i/100ms
384
+ collect.Hash 30.250k i/100ms
385
+ map.to_h 31.925k i/100ms
386
+ to_h block 42.127k i/100ms
387
+ transform_values 87.393k i/100ms
388
+ Calculating -------------------------------------
389
+ each_with_object 269.839k (± 0.2%) i/s - 1.359M in 5.037950s
390
+ collect.Hash 303.464k (± 0.2%) i/s - 1.543M in 5.084567s
391
+ map.to_h 318.494k (± 0.0%) i/s - 1.596M in 5.011840s
392
+ to_h block 419.913k (± 0.0%) i/s - 2.106M in 5.016300s
393
+ transform_values 801.802k (± 0.6%) i/s - 4.020M in 5.015563s
394
+ with 95.0% confidence
395
+
396
+ Comparison:
397
+ transform_values: 801801.6 i/s
398
+ to_h block: 419913.0 i/s - 1.91x (± 0.01) slower
399
+ map.to_h: 318494.2 i/s - 2.52x (± 0.01) slower
400
+ collect.Hash: 303464.4 i/s - 2.64x (± 0.02) slower
401
+ each_with_object: 269839.2 i/s - 2.97x (± 0.02) slower
402
+ with 95.0% confidence
403
+ ```
404
+
405
+ #### Hash value enumeration (size=100)
406
+
407
+ ```
408
+ Warming up --------------------------------------
409
+ each_with_object 6.319k i/100ms
410
+ collect.Hash 6.686k i/100ms
411
+ map.to_h 7.245k i/100ms
412
+ to_h block 9.317k i/100ms
413
+ transform_values 20.555k i/100ms
414
+ Calculating -------------------------------------
415
+ each_with_object 63.102k (± 0.3%) i/s - 315.950k in 5.008225s
416
+ collect.Hash 66.782k (± 0.0%) i/s - 334.300k in 5.005839s
417
+ map.to_h 72.403k (± 0.0%) i/s - 362.250k in 5.003248s
418
+ to_h block 93.020k (± 0.0%) i/s - 465.850k in 5.008075s
419
+ transform_values 207.295k (± 0.1%) i/s - 1.048M in 5.057171s
420
+ with 95.0% confidence
421
+
422
+ Comparison:
423
+ transform_values: 207294.9 i/s
424
+ to_h block: 93020.0 i/s - 2.23x (± 0.00) slower
425
+ map.to_h: 72403.1 i/s - 2.86x (± 0.00) slower
426
+ collect.Hash: 66782.1 i/s - 3.10x (± 0.00) slower
427
+ each_with_object: 63102.3 i/s - 3.28x (± 0.01) slower
428
+ with 95.0% confidence
429
+ ```
430
+
431
+ #### Hash value enumeration (size=500)
432
+
433
+ ```
434
+ Warming up --------------------------------------
435
+ each_with_object 1.316k i/100ms
436
+ collect.Hash 1.398k i/100ms
437
+ map.to_h 1.496k i/100ms
438
+ to_h block 1.876k i/100ms
439
+ transform_values 4.471k i/100ms
440
+ Calculating -------------------------------------
441
+ each_with_object 13.154k (± 0.1%) i/s - 65.800k in 5.002444s
442
+ collect.Hash 13.983k (± 0.0%) i/s - 71.298k in 5.099149s
443
+ map.to_h 14.968k (± 0.0%) i/s - 76.296k in 5.097225s
444
+ to_h block 18.745k (± 0.0%) i/s - 93.800k in 5.004043s
445
+ transform_values 44.903k (± 0.7%) i/s - 228.021k in 5.082046s
446
+ with 95.0% confidence
447
+
448
+ Comparison:
449
+ transform_values: 44903.5 i/s
450
+ to_h block: 18744.9 i/s - 2.40x (± 0.02) slower
451
+ map.to_h: 14968.1 i/s - 3.00x (± 0.02) slower
452
+ collect.Hash: 13982.6 i/s - 3.21x (± 0.02) slower
453
+ each_with_object: 13153.9 i/s - 3.41x (± 0.02) slower
454
+ with 95.0% confidence
455
+ ```