From: merch-redmine@... Date: 2014-07-01T22:25:49+00:00 Subject: [ruby-core:63478] [ruby-trunk - Bug #10003] Hash#fetch performance issue Issue #10003 has been updated by Jeremy Evans. I believe this is expected since the Hash#[] call is optimized to call rb_hash_aref (see opt_aref in insns.def), where the Hash#fetch call goes through normal method dispatch. Array#[] calls are similarly optimized to call rb_ary_entry. ---------------------------------------- Bug #10003: Hash#fetch performance issue https://bugs.ruby-lang.org/issues/10003#change-47521 * Author: Richard Schneeman * Status: Open * Priority: Normal * Assignee: * Category: core * Target version: * ruby -v: 2.1.2 * Backport: 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- It looks like there is a performance issue with Hash#fetch compared to Hash#[]. I found this issue via this gist: https://gist.github.com/jonleighton/3552829. I could not find it reported anywhere on the tracker, forgive me if this is a known issue: ``` require 'benchmark/ips' h = { foo: :bar } Benchmark.ips do |r| r.report('#[]') { h[:foo] } r.report('#fetch') { h.fetch(:foo) } end Calculating ------------------------------------- #[] 124893 i/100ms #fetch 121729 i/100ms ------------------------------------------------- #[] 6917857.4 (��20.4%) i/s - 32472180 in 5.008832s #fetch 4570251.5 (��18.8%) i/s - 22032949 in 5.015712s ``` This is in Ruby 2.1.2 -- https://bugs.ruby-lang.org/