Actions
Bug #13365
closedImprove performance of rb_equal() with special constants
Description
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
Actions
Like0
Like0