radius-spec 0.5.0 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,305 @@
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
+ # rubocop:disable Style/HashEachMethods
7
+
8
+ display_benchmark_header
9
+
10
+ # Bad per Rubocop
11
+ def hash_keys_each(hash)
12
+ hash.keys.each { |k| k + 1 }
13
+
14
+ # Return nil to avoid array creation penalty which may skew benchmark
15
+ nil
16
+ end
17
+
18
+ # Good per Rubocop
19
+ def hash_each_key(hash)
20
+ hash.each_key { |k| k + 1 }
21
+
22
+ # Return nil to avoid array creation penalty which may skew benchmark
23
+ nil
24
+ end
25
+
26
+ [
27
+ [],
28
+ (1..5),
29
+ (1..10),
30
+ (1..20),
31
+ (1..100),
32
+ (1..500),
33
+ ].each do |data|
34
+ test_hash = data.zip(data).to_h
35
+
36
+ section "Hash key enumeration (size=#{data.size})" do |bench|
37
+ bench.report("Hash.keys.each") do
38
+ hash_keys_each(test_hash)
39
+ end
40
+
41
+ bench.report("Hash.each_key") do
42
+ hash_each_key(test_hash)
43
+ end
44
+ end
45
+ end
46
+
47
+ # Bad per Rubocop
48
+ def hash_values_each(hash)
49
+ hash.values.each { |v| v + 1 }
50
+
51
+ # Return nil to avoid array creation penalty which may skew benchmark
52
+ nil
53
+ end
54
+
55
+ # Good per Rubocop
56
+ def hash_each_value(hash)
57
+ hash.each_value { |v| v + 1 }
58
+
59
+ # Return nil to avoid array creation penalty which may skew benchmark
60
+ nil
61
+ end
62
+
63
+ [
64
+ [],
65
+ (1..5),
66
+ (1..10),
67
+ (1..20),
68
+ (1..100),
69
+ (1..500),
70
+ ].each do |data|
71
+ test_hash = data.zip(data).to_h
72
+
73
+ section "Hash value enumeration (size=#{data.size})" do |bench|
74
+ bench.report("Hash.values.each") do
75
+ hash_values_each(test_hash)
76
+ end
77
+
78
+ bench.report("Hash.each_value") do
79
+ hash_each_value(test_hash)
80
+ end
81
+ end
82
+ end
83
+
84
+ # rubocop:enable Style/HashEachMethods
85
+
86
+ __END__
87
+
88
+ ### Environment
89
+
90
+ Heroku Performance-L Dyno
91
+
92
+ ruby 2.7.3p183 (2021-04-05 revision 6847ee089d) [x86_64-linux]
93
+ GC Disabled: false
94
+
95
+ ### Test Cases
96
+
97
+ Behavior for the keys and value enumerations is roughly equivalent. As
98
+ hypothesized the `each_xyz` versions are faster. What is surprising is that the
99
+ performance difference drops off drastically the larger the hash, even for
100
+ small hash sizes. Basically, once the hash reaches 10 times, the performance
101
+ gains are constant after that point (around 1 - 4%).
102
+
103
+ #### Hash key enumeration (size=0)
104
+
105
+ ```
106
+ Warming up --------------------------------------
107
+ Hash.keys.each 913.942k i/100ms
108
+ Hash.each_key 1.376M i/100ms
109
+ Calculating -------------------------------------
110
+ Hash.keys.each 9.167M (± 0.0%) i/s - 46.611M in 5.084564s
111
+ Hash.each_key 13.734M (± 0.2%) i/s - 68.779M in 5.008581s
112
+ with 95.0% confidence
113
+
114
+ Comparison:
115
+ Hash.each_key: 13734476.7 i/s
116
+ Hash.keys.each: 9167168.9 i/s - 1.50x (± 0.00) slower
117
+ with 95.0% confidence
118
+ ```
119
+
120
+ #### Hash key enumeration (size=5)
121
+
122
+ ```
123
+ Warming up --------------------------------------
124
+ Hash.keys.each 319.678k i/100ms
125
+ Hash.each_key 360.081k i/100ms
126
+ Calculating -------------------------------------
127
+ Hash.keys.each 3.190M (± 0.4%) i/s - 15.984M in 5.012434s
128
+ Hash.each_key 3.596M (± 0.0%) i/s - 18.004M in 5.006636s
129
+ with 95.0% confidence
130
+
131
+ Comparison:
132
+ Hash.each_key: 3596043.0 i/s
133
+ Hash.keys.each: 3189893.5 i/s - 1.13x (± 0.00) slower
134
+ with 95.0% confidence
135
+ ```
136
+
137
+ #### Hash key enumeration (size=10)
138
+
139
+ ```
140
+ Warming up --------------------------------------
141
+ Hash.keys.each 201.546k i/100ms
142
+ Hash.each_key 209.461k i/100ms
143
+ Calculating -------------------------------------
144
+ Hash.keys.each 2.019M (± 0.3%) i/s - 10.279M in 5.092727s
145
+ Hash.each_key 2.095M (± 0.0%) i/s - 10.683M in 5.099576s
146
+ with 95.0% confidence
147
+
148
+ Comparison:
149
+ Hash.each_key: 2094785.3 i/s
150
+ Hash.keys.each: 2018768.6 i/s - 1.04x (± 0.00) slower
151
+ with 95.0% confidence
152
+ ```
153
+
154
+ #### Hash key enumeration (size=20)
155
+
156
+ ```
157
+ Warming up --------------------------------------
158
+ Hash.keys.each 118.004k i/100ms
159
+ Hash.each_key 118.320k i/100ms
160
+ Calculating -------------------------------------
161
+ Hash.keys.each 1.176M (± 0.4%) i/s - 5.900M in 5.021554s
162
+ Hash.each_key 1.182M (± 0.2%) i/s - 5.916M in 5.006809s
163
+ with 95.0% confidence
164
+
165
+ Comparison:
166
+ Hash.each_key: 1181738.4 i/s
167
+ Hash.keys.each: 1175522.6 i/s - same-ish: difference falls within error
168
+ with 95.0% confidence
169
+ ```
170
+
171
+ #### Hash key enumeration (size=100)
172
+
173
+ ```
174
+ Warming up --------------------------------------
175
+ Hash.keys.each 27.217k i/100ms
176
+ Hash.each_key 26.138k i/100ms
177
+ Calculating -------------------------------------
178
+ Hash.keys.each 272.497k (± 0.0%) i/s - 1.388M in 5.093882s
179
+ Hash.each_key 260.563k (± 0.4%) i/s - 1.307M in 5.017483s
180
+ with 95.0% confidence
181
+
182
+ Comparison:
183
+ Hash.keys.each: 272497.2 i/s
184
+ Hash.each_key: 260563.2 i/s - 1.05x (± 0.00) slower
185
+ with 95.0% confidence
186
+ ```
187
+
188
+ #### Hash key enumeration (size=500)
189
+
190
+ ```
191
+ Warming up --------------------------------------
192
+ Hash.keys.each 5.592k i/100ms
193
+ Hash.each_key 5.404k i/100ms
194
+ Calculating -------------------------------------
195
+ Hash.keys.each 55.763k (± 0.2%) i/s - 279.600k in 5.014897s
196
+ Hash.each_key 54.060k (± 0.1%) i/s - 275.604k in 5.098253s
197
+ with 95.0% confidence
198
+
199
+ Comparison:
200
+ Hash.keys.each: 55763.3 i/s
201
+ Hash.each_key: 54060.3 i/s - 1.03x (± 0.00) slower
202
+ with 95.0% confidence
203
+ ```
204
+
205
+ #### Hash value enumeration (size=0)
206
+
207
+ ```
208
+ Warming up --------------------------------------
209
+ Hash.values.each 922.361k i/100ms
210
+ Hash.each_value 1.372M i/100ms
211
+ Calculating -------------------------------------
212
+ Hash.values.each 9.229M (± 0.0%) i/s - 47.040M in 5.096857s
213
+ Hash.each_value 13.736M (± 0.0%) i/s - 69.983M in 5.094986s
214
+ with 95.0% confidence
215
+
216
+ Comparison:
217
+ Hash.each_value: 13735592.7 i/s
218
+ Hash.values.each: 9229287.5 i/s - 1.49x (± 0.00) slower
219
+ with 95.0% confidence
220
+ ```
221
+
222
+ #### Hash value enumeration (size=5)
223
+
224
+ ```
225
+ Warming up --------------------------------------
226
+ Hash.values.each 317.174k i/100ms
227
+ Hash.each_value 358.507k i/100ms
228
+ Calculating -------------------------------------
229
+ Hash.values.each 3.190M (± 0.0%) i/s - 16.176M in 5.071511s
230
+ Hash.each_value 3.582M (± 0.0%) i/s - 17.925M in 5.004607s
231
+ with 95.0% confidence
232
+
233
+ Comparison:
234
+ Hash.each_value: 3581759.4 i/s
235
+ Hash.values.each: 3189555.5 i/s - 1.12x (± 0.00) slower
236
+ with 95.0% confidence
237
+ ```
238
+
239
+ #### Hash value enumeration (size=10)
240
+
241
+ ```
242
+ Warming up --------------------------------------
243
+ Hash.values.each 201.766k i/100ms
244
+ Hash.each_value 209.128k i/100ms
245
+ Calculating -------------------------------------
246
+ Hash.values.each 2.032M (± 0.0%) i/s - 10.290M in 5.065224s
247
+ Hash.each_value 2.093M (± 0.0%) i/s - 10.666M in 5.096053s
248
+ with 95.0% confidence
249
+
250
+ Comparison:
251
+ Hash.each_value: 2092905.3 i/s
252
+ Hash.values.each: 2031517.4 i/s - 1.03x (± 0.00) slower
253
+ with 95.0% confidence
254
+ ```
255
+
256
+ #### Hash value enumeration (size=20)
257
+
258
+ ```
259
+ Warming up --------------------------------------
260
+ Hash.values.each 117.255k i/100ms
261
+ Hash.each_value 117.577k i/100ms
262
+ Calculating -------------------------------------
263
+ Hash.values.each 1.182M (± 0.1%) i/s - 5.980M in 5.058729s
264
+ Hash.each_value 1.176M (± 0.0%) i/s - 5.996M in 5.098809s
265
+ with 95.0% confidence
266
+
267
+ Comparison:
268
+ Hash.values.each: 1182126.7 i/s
269
+ Hash.each_value: 1176047.5 i/s - 1.01x (± 0.00) slower
270
+ with 95.0% confidence
271
+ ```
272
+
273
+ #### Hash value enumeration (size=100)
274
+
275
+ ```
276
+ Warming up --------------------------------------
277
+ Hash.values.each 27.263k i/100ms
278
+ Hash.each_value 26.208k i/100ms
279
+ Calculating -------------------------------------
280
+ Hash.values.each 275.209k (± 0.0%) i/s - 1.390M in 5.052242s
281
+ Hash.each_value 261.696k (± 0.0%) i/s - 1.310M in 5.007358s
282
+ with 95.0% confidence
283
+
284
+ Comparison:
285
+ Hash.values.each: 275209.0 i/s
286
+ Hash.each_value: 261696.2 i/s - 1.05x (± 0.00) slower
287
+ with 95.0% confidence
288
+ ```
289
+
290
+ #### Hash value enumeration (size=500)
291
+
292
+ ```
293
+ Warming up --------------------------------------
294
+ Hash.values.each 5.586k i/100ms
295
+ Hash.each_value 5.408k i/100ms
296
+ Calculating -------------------------------------
297
+ Hash.values.each 56.245k (± 0.2%) i/s - 284.886k in 5.066190s
298
+ Hash.each_value 54.104k (± 0.0%) i/s - 275.808k in 5.097780s
299
+ with 95.0% confidence
300
+
301
+ Comparison:
302
+ Hash.values.each: 56244.5 i/s
303
+ Hash.each_value: 54104.0 i/s - 1.04x (± 0.00) slower
304
+ with 95.0% confidence
305
+ ```
@@ -5,7 +5,7 @@ require_relative 'bm_setup'
5
5
 
6
6
  display_benchmark_header
7
7
 
8
- ENUM = (1..100)
8
+ ENUM = (1..100).freeze
9
9
 
10
10
  def hash_merge
11
11
  tmp = {}