Create a gist now

Instantly share code, notes, and snippets.

require 'benchmark/ips'
h = { foo: :bar }
Benchmark.ips do |r|
r.report('#[]') { h[:foo] }
r.report('#fetch') { h.fetch(:foo) }
end
Calculating -------------------------------------
#[] 84463 i/100ms
#fetch 58818 i/100ms
-------------------------------------------------
#[] 3004469.2 (±1.6%) i/s - 15034414 in 5.005338s
#fetch 2196062.9 (±0.8%) i/s - 10998966 in 5.008783s
@dball
dball commented Aug 31, 2012

Looks like rb_hash_fetch_m winds up calling rb_scan_args and rb_block_given_p where rb_hash_aref does not. rb_block_given_p could move into the conditional which evaluates it if one doesn't care about the warning. I don't know what you could do about parsing the varargs though.

@avsej
avsej commented Dec 30, 2015

does not look like significanly slower anymore

~ $ ruby hash_access_benchmark.rb 
Calculating -------------------------------------
                 #[]   216.732k i/100ms
              #fetch   217.366k i/100ms
-------------------------------------------------
                 #[]     11.665M (± 1.7%) i/s -     58.301M
              #fetch     10.387M (± 0.6%) i/s -     51.950M
~ $ ruby -v
ruby 2.2.4p230 (2015-12-16 revision 53155) [x86_64-linux]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment