Project

General

Profile

Feature #13374

Fix one of performance regressions in method calling

Added by watson1978 (Shizuo Fujita) over 2 years ago. Updated 25 days ago.

Status:
Open
Priority:
Normal
Assignee:
-
Target version:
-
[ruby-core:80424]

Description

Seems that LIKELY() introduces some penalties at branching.

Ruby 2.4.1

$ ruby -v ~/tmp/bench.rb
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
       user     system      total        real
   1.460000   0.010000   1.470000 (  1.462540)

Ruby trunk without patch

$ ./miniruby -v -Ilib ~/tmp/bench.rb
ruby 2.5.0dev (2017-03-28 trunk 58156) [x86_64-darwin16]
       user     system      total        real
   1.580000   0.000000   1.580000 (  1.579428)

Ruby trunk with patch

$ ./miniruby -v -Ilib ~/tmp/bench.rb
ruby 2.5.0dev (2017-03-28 trunk 58156) [x86_64-darwin16]
       user     system      total        real
   1.510000   0.000000   1.510000 (  1.505948)

Test code

require 'benchmark'

Benchmark.bm do |x|
  ary = [1,2,3]

  x.report do
    20000000.times do
      ary.at(2)
    end
  end

end

Patch

https://github.com/ruby/ruby/pull/1556

History

Updated by watson1978 (Shizuo Fujita) over 2 years ago

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

Ruby 2.4.1

$ ./miniruby -v -Ilib ~/tmp/bench.rb
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin16]
       user     system      total        real
   1.310000   0.000000   1.310000 (  1.314179)

Ruby trunk without patch

$ ./miniruby -v -Ilib ~/tmp/bench.rb
ruby 2.5.0dev (2017-03-28 trunk 58192) [x86_64-darwin16]
       user     system      total        real
   1.360000   0.000000   1.360000 (  1.361560)

Ruby trunk with all patches

$ ./miniruby -v -Ilib ~/tmp/bench.rb
ruby 2.5.0dev (2017-03-28 trunk 58192) [x86_64-darwin16]
       user     system      total        real
   1.290000   0.000000   1.290000 (  1.297583)

Ubuntu 16.04.4 + gcc 5.4.0

Ruby 2.4.1

$ ./miniruby -v -Ilib ~/bench/bench.rb
ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-linux]
       user     system      total        real
   0.810000   0.000000   0.810000 (  0.812250)

Ruby trunk without patch

$ ./miniruby -v -Ilib ~/bench/bench.rb
ruby 2.5.0dev (2017-03-28 trunk 58192) [x86_64-linux]
       user     system      total        real
   0.830000   0.000000   0.830000 (  0.824743)

Ruby trunk with all patches

$ ./miniruby -v -Ilib ~/bench/bench.rb
ruby 2.5.0dev (2017-03-28 trunk 58192) [x86_64-linux]
       user     system      total        real
   0.830000   0.000000   0.830000 (  0.826192)
#2

Updated by jeremyevans0 (Jeremy Evans) 25 days ago

  • Backport deleted (2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN)
  • Tracker changed from Bug to Feature

Also available in: Atom PDF