[ruby-dev:50077] [Ruby trunk Bug#13342] Improve yielding block performance
From:
watson1978@...
Date:
2017-04-14 08:40:23 UTC
List:
ruby-dev #50077
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/