Koichi ITO
819871cc4e
Enable `Style/MapToHash` cop
...
Ruby 2.6 added block argument processing to `Enumerable#to_h`.
https://bugs.ruby-lang.org/issues/15143
Rails 7 requires Ruby 2.7.0 or higher, so the new feature can use it.
`Style/MapToHash` cop will detect it. And this cop in the `Style` department,
but this seems to improve performance as follows:
```ruby
# map_to_hash.rb
require 'benchmark/ips'
ARRAY = (1..100).to_a
HASH = {foo: 1, bar: 2}
Benchmark.ips do |x|
x.report('array.map.to_h') { ARRAY.map { |v| [v, v * 2] }.to_h }
x.report('array.to_h') { ARRAY.to_h { |v| [v, v * 2] } }
x.compare!
end
Benchmark.ips do |x|
x.report('hash.map.to_h') { HASH.map { |k, v| [k.to_s, v * 2] }.to_h }
x.report('hash.to_h') { HASH.to_h { |k, v| [k.to_s, v * 2] } }
x.compare!
end
```
```console
% ruby map_to_hash.rb
Warming up --------------------------------------
array.map.to_h 9.063k i/100ms
array.to_h 9.609k i/100ms
Calculating -------------------------------------
array.map.to_h 89.063k (± 3.9%) i/s - 453.150k in 5.096572s
array.to_h 96.449k (± 1.7%) i/s - 490.059k in 5.082529s
Comparison:
array.to_h: 96448.7 i/s
array.map.to_h: 89063.4 i/s - 1.08x (± 0.00) slower
Warming up --------------------------------------
hash.map.to_h 106.284k i/100ms
hash.to_h 149.354k i/100ms
Calculating -------------------------------------
hash.map.to_h 1.102M (± 2.2%) i/s - 5.527M in 5.019657s
hash.to_h 1.490M (± 0.9%) i/s - 7.468M in 5.013264s
Comparison:
hash.to_h: 1489707.0 i/s
hash.map.to_h: 1101561.5 i/s - 1.35x (± 0.00) slower
```
`Style/MapToHash` cop ... https://docs.rubocop.org/rubocop/1.25/cops_style.html#stylemaptohash
2022-02-26 04:31:03 +09:00