Closed
Description
Performance/BlockGivenWithExplicitBlock
provides bad guidance and should be removed. The benchmark which was given when it was introduced didn't test the case that a block was given, when that happens block
is significantly slower than the other option.
For Ruby 3.2+ I made if block
faster, but prior to that the advice from this cop was always wrong. Even in 3.2+ I believe it's bad advice as there's only a very narrow usage for which block
is (very slightly) faster, and even in those cases it's likely a future refactor the user will accidentally introduce the slow case (ex. moving from if block
to if block && something_else
)
require 'bundler/inline'
gemfile(true) do
gem 'benchmark-ips'
end
def if_block(&block)
!!block
end
def if_block_given(&block)
!!block_given?
end
Benchmark.ips do |x|
x.report('block') { if_block }
x.report('block w/ block') { if_block {} }
x.report('block_given?') { if_block_given }
x.report('block_given? w/ block') { if_block_given {} }
x.compare!
end
Warming up --------------------------------------
block 1.612M i/100ms
block w/ block 508.391k i/100ms
block_given? 1.309M i/100ms
block_given? w/ block
1.068M i/100ms
Calculating -------------------------------------
block 15.804M (± 1.8%) i/s - 79.000M in 5.000346s
block w/ block 5.017M (± 0.5%) i/s - 25.420M in 5.067106s
block_given? 13.297M (± 1.7%) i/s - 66.746M in 5.021282s
block_given? w/ block
10.745M (± 0.6%) i/s - 54.450M in 5.067787s
Comparison:
block: 15804072.8 i/s
block_given?: 13296844.8 i/s - 1.19x slower
block_given? w/ block: 10744860.7 i/s - 1.47x slower
block w/ block: 5016692.5 i/s - 3.15x slower
Metadata
Metadata
Assignees
Labels
No labels
Activity