Issue #13342 has been updated by watson1978 (Shizuo Fujita). When I filed this ticket, I tried to run benchmark on macOS + clang only. Then, I tried to do on 2 environments in additional. ## macOS 10.12 + gcc 6.3.0 ### Before ~~~ user system total real Integer#times 0.890000 0.000000 0.890000 ( 0.886378) Array#each 0.840000 0.010000 0.850000 ( 0.849755) Array#map 1.070000 0.030000 1.100000 ( 1.094257) ~~~ ### After ~~~ user system total real Integer#times 0.860000 0.000000 0.860000 ( 0.860164) Array#each 0.870000 0.000000 0.870000 ( 0.867758) Array#map 1.070000 0.030000 1.100000 ( 1.102324) ~~~ ## Ubuntu 16.04.4 + gcc 5.4.0 ### Before ~~~ user system total real Integer#times 0.560000 0.000000 0.560000 ( 0.561627) Array#each 0.550000 0.000000 0.550000 ( 0.552468) Array#map 0.710000 0.000000 0.710000 ( 0.714104) ~~~ ### After ~~~ user system total real Integer#times 0.530000 0.000000 0.530000 ( 0.533428) Array#each 0.530000 0.000000 0.530000 ( 0.526173) Array#map 0.650000 0.020000 0.670000 ( 0.676441) ~~~ ---------------------------------------- Bug #13342: Improve yielding block performance https://bugs.ruby-lang.org/issues/13342#change-64229 * 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/