From: watson1978@... Date: 2017-03-26T04:48:07+00:00 Subject: [ruby-core:80360] [Ruby trunk Bug#13365] Improve performance of rb_equal() with special constants 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: