[ruby-core:80360] [Ruby trunk Bug#13365] Improve performance of rb_equal() with special constants

From: watson1978@...
Date: 2017-03-26 04:48:07 UTC
List: ruby-core #80360
Issue #13365 has been reported by watson1978 (Shizuo Fujita).

----------------------------------------
Bug #13365: Improve performance of rb_equal() with special constants
https://bugs.ruby-lang.org/issues/13365

* Author: watson1978 (Shizuo Fujita)
* Status: Open
* Priority: Normal
* Assignee: 
* Target version: 
* ruby -v: 
* Backport: 2.2: UNKNOWN, 2.3: UNKNOWN, 2.4: UNKNOWN
----------------------------------------
rb_equal() is been using in many places to compare the object.

If objects are special constants,
"if (obj1 == obj2) return Qtrue;" can check whether objects are equal or not.
(https://github.com/ruby/ruby/blob/0b1f6aed9414a4d7714910e61db08fdb2ac3ecd1/object.c#L90)
So, it can skip rb_funcall() calling to comfirm that special constant objects are not equal.

At least, Time#eql? will be faster around 60%.
Time object might have Finuxm (special constant) value internally on 64 bit environment.

### Before
~~~
                              user     system      total        real
Time#eql? with receiver   0.890000   0.000000   0.890000 (  0.891377)
Time#eql? with other      1.430000   0.000000   1.430000 (  1.429047)
~~~

### After
~~~
                              user     system      total        real
Time#eql? with receiver   0.890000   0.000000   0.890000 (  0.890050)
Time#eql? with other      0.900000   0.000000   0.900000 (  0.905941)
~~~

### Test code
~~~
require 'benchmark'

Benchmark.bmbm do |x|
  t1 = Time.now
  t2 = Time.now

  x.report "Time#eql? with receiver" do
    10000000.times do
      t1.eql?(t1)
    end
  end

  x.report "Time#eql? with other" do
    10000000.times do
      t1.eql?(t2)
    end
  end

end
~~~

### Patch
The patch is in https://github.com/ruby/ruby/pull/1552



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request@ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next