fast-ruby icon indicating copy to clipboard operation
fast-ruby copied to clipboard

Encourage `Hash#compare_by_identity`

Open marcandre opened this issue 4 years ago • 2 comments

If one is using keys that can be compared by identity, and if those keys are not already optimized (symbols are optimized, not sure what else is), using compare_by_identity can yield a 4x speedup.

require 'benchmark/ips'

KEY = Class.new
CACHE = {KEY => :foo}
CACHE_BY_ID = {KEY => :foo}.compare_by_identity

def fast
  CACHE_BY_ID[KEY]
end

def slow
  CACHE[KEY]
end

Benchmark.ips do |x|
  x.report('lookup with compare_by_identity') { fast }
  x.report('lookup') { slow }
  x.compare!
end
lookup with compare_by_identity
                         10.781M (± 3.3%) i/s -     54.709M in   5.081038s
              lookup      2.571M (± 3.2%) i/s -     13.089M in   5.097409s

Comparison:
lookup with compare_by_identity: 10781059.3 i/s
              lookup:  2570641.2 i/s - 4.19x  (± 0.00) slower

Same result if lookup is not successful (as long as the hash is not empty...)

I hope we can optimize this a bit.

marcandre avatar Dec 23 '20 02:12 marcandre

Can be optimized... https://github.com/ruby/ruby/pull/3987

marcandre avatar Dec 23 '20 21:12 marcandre

In Ruby 3.0+, the performance difference will still exist but won't be as noticeable.

marcandre avatar Dec 29 '20 17:12 marcandre