Encourage `Hash#compare_by_identity` · Issue #189 · fastruby/fast-ruby · GitHub
Skip to content

Encourage Hash#compare_by_identity #189

Open

Description

@marcandre

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.

Activity

  1. marcandre commented on Dec 23, 2020

    @marcandre
    Author

    Can be optimized... ruby/ruby#3987

  2. marcandre commented on Dec 29, 2020

    @marcandre
    Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions