-
Notifications
You must be signed in to change notification settings - Fork 375
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
Add Hash#values_at vs Array#map { Hash#[] } comparison #174
base: main
Are you sure you want to change the base?
Conversation
DO NOT MERGE YET. Just noticed that Will update the code and the benchmark, and see if it's still worth merging. |
This is faster than KEYS.map{ |key| HASH[key] } |
@Arcovion, cool! Will add it to the benchmark, too. Thanks! |
Added more ways of slicing Hash values, and organized them into three separate cases:
Thoughts? |
@kewlar I see the value in adding I'm happy to add code/hash/values_at-vs-map.rb if you submit just that in this PR or another PR. |
@etagwerker, thanks for the feedback! You're right, the other benchmarks are really just edge cases, and don't contribute much. And I've removed the redundant benchmarks. How does it look now? |
d: 'qux' | ||
}.freeze | ||
|
||
# Some of the keys may not exist in the hash; we want to keep the default values. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For existing keys, the benchmark does not change much.
# frozen_string_literal: true
require 'benchmark/ips'
HASH = {
a: 'foo',
b: 'bar',
c: 'baz',
d: 'qux'
}.freeze
# the keys exist in the hash
KEYS = %i[a b c d].freeze
def fastest
HASH.values_at(*KEYS)
end
def slow
HASH.fetch_values(*KEYS)
end
def slowest
KEYS.map { |key| HASH[key] }
end
Benchmark.ips do |x|
x.report('Hash#values_at ') { fastest }
x.report('Hash#fetch_values ') { slow }
x.report('Array#map { Hash#[] }') { slowest }
x.compare!
end
ydakuka@yauhenid:~/ruby-docker-app$ docker run ruby-app
Warming up --------------------------------------
Hash#values_at
405.669k i/100ms
Hash#fetch_values
354.263k i/100ms
Array#map { Hash#[] }
221.960k i/100ms
Calculating -------------------------------------
Hash#values_at
4.191M (± 4.7%) i/s - 21.095M in 5.045130s
Hash#fetch_values
3.895M (± 6.8%) i/s - 19.484M in 5.031663s
Array#map { Hash#[] }
2.429M (± 6.1%) i/s - 12.208M in 5.048470s
Comparison:
Hash#values_at : 4190993.6 i/s
Hash#fetch_values : 3894866.5 i/s - same-ish: difference falls within error
Array#map { Hash#[] }: 2429428.6 i/s - 1.73x slower
No description provided.