Issue #13342 has been reported by watson1978 (Shizuo Fujita). ---------------------------------------- Bug #13342: Improve yielding block performance https://bugs.ruby-lang.org/issues/13342 * Author: watson1978 (Shizuo Fujita) * Status: Open * Priority: Normal * Assignee: * Target version: * ruby -v: * Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN ---------------------------------------- The yielding block will be faster around 9%. This patch ensures that expand to inline codes in where invoke yielding block. ### Environment * macOS 10.12.3 * clang 8.0.0 in Xcode 8.2 ### Before ~~~ user system total real Integer#times 0.930000 0.000000 0.930000 ( 0.932125) Array#each 0.950000 0.000000 0.950000 ( 0.957962) Array#map 1.220000 0.030000 1.250000 ( 1.249174) ~~~ ### After ~~~ user system total real Integer#times 0.850000 0.000000 0.850000 ( 0.853202) Array#each 0.860000 0.010000 0.870000 ( 0.865507) Array#map 1.120000 0.020000 1.140000 ( 1.149939) ~~~ ### Test code ~~~ require 'benchmark' Benchmark.bmbm do |x| ary = (1..10000).to_a x.report "Integer#times" do 20000000.times do end end x.report "Array#each" do 2000.times do ary.each { |x| } end end x.report "Array#map" do 2000.times do ary.map { |x| } end end end ~~~ ### Patch The patch is in https://github.com/ruby/ruby/pull/1535 -- https://bugs.ruby-lang.org/