Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Encourage Hash#compare_by_identity #189

Open
marcandre opened this issue Dec 23, 2020 · 2 comments
Open

Encourage Hash#compare_by_identity #189

marcandre opened this issue Dec 23, 2020 · 2 comments

Comments

@marcandre
Copy link

marcandre commented Dec 23, 2020

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 added a commit to marcandre/ruby that referenced this issue Dec 23, 2020
Using `compare_by_identity` gives a 4x performance boost on cache hits.
Benchmark in fastruby/fast-ruby#189
marcandre added a commit to marcandre/ruby that referenced this issue Dec 23, 2020
Using `compare_by_identity` gives a 4x performance boost on cache hits.
Benchmark in fastruby/fast-ruby#189
marcandre added a commit to marcandre/ruby that referenced this issue Dec 23, 2020
Using `compare_by_identity` gives a 4x performance boost on cache hits.
Benchmark in fastruby/fast-ruby#189
marcandre added a commit to ruby/ruby that referenced this issue Dec 23, 2020
Using `compare_by_identity` gives a 4x performance boost on cache hits.
Benchmark in fastruby/fast-ruby#189
hsbt pushed a commit to ruby/psych that referenced this issue Dec 23, 2020
Using `compare_by_identity` gives a 4x performance boost on cache hits.
Benchmark in fastruby/fast-ruby#189
@marcandre
Copy link
Author

Can be optimized... ruby/ruby#3987

@marcandre
Copy link
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
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant