From: ko1@... Date: 2015-03-19T10:12:35+00:00 Subject: [ruby-core:68559] [Ruby trunk - Misc #10983] Why blocks make Ruby methods 439% slower ? Issue #10983 has been updated by Koichi Sasada. To capture local variables and so on (== an environment) for several frames is too heavy. For example, ```ruby 1.times{ 1.times{ 1.times{ Proc.new{} } } } ``` you need to capture all blocks' environments. You don't need to capture environments only passing block. So you need to say "passing block is faster" :) BTW, I agree it is slow. Improve the performance on this behavior will be great job. ---------------------------------------- Misc #10983: Why blocks make Ruby methods 439% slower ? https://bugs.ruby-lang.org/issues/10983#change-51875 * Author: ������������ �� * Status: Open * Priority: Normal * Assignee: ---------------------------------------- https://www.omniref.com/ruby/2.2.0/symbols/Proc/yield#annotation=4087638&line=711&hn=1 require 'benchmark/ips' def block_call(&block) block.call end def just_yield yield end Benchmark.ips do |x| x.report("call") do block_call { 1 + 1 } end x.report("just yield") do just_yield { 1 + 1 } end x.compare! end I run on Ruby 2.2.1 Calculating ------------------------------------- call 40.754k i/100ms just yield 69.031k i/100ms ------------------------------------------------- call 814.929k (�� 4.0%) i/s - 4.075M just yield 2.871M (��25.1%) i/s - 12.909M Comparison: just yield: 2871127.3 i/s call: 814929.3 i/s - 3.52x slower -- https://bugs.ruby-lang.org/