Skip to content

Commit a1b2ca2

Browse files
didelerJuanitoFatas
authored andcommitted
Add benchmark for Hash#dig vs #[] vs #fetch
1 parent f56798b commit a1b2ca2

File tree

2 files changed

+53
-0
lines changed

2 files changed

+53
-0
lines changed

README.md

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -591,6 +591,32 @@ Comparison:
591591
Hash#fetch, string: 3981166.5 i/s - 1.89x slower
592592
```
593593

594+
##### `Hash#dig` vs `Hash#[]` vs `Hash#fetch` [code](code/hash/dig-vs-[]-fetch.rb)
595+
596+
```
597+
$ ruby -v code/hash/dig-vs-\[\]-vs-fetch.rb
598+
ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-darwin15]
599+
Warming up --------------------------------------
600+
Hash#dig 144.192k i/100ms
601+
Hash#[] 148.853k i/100ms
602+
Hash#[] fallback 149.761k i/100ms
603+
Hash#fetch 132.257k i/100ms
604+
Hash#fetch fallback 120.420k i/100ms
605+
Calculating -------------------------------------
606+
Hash#dig 6.253M (± 5.9%) i/s - 31.145M
607+
Hash#[] 6.733M (± 5.9%) i/s - 33.641M
608+
Hash#[] fallback 6.209M (± 5.7%) i/s - 31.001M
609+
Hash#fetch 4.500M (± 5.0%) i/s - 22.484M
610+
Hash#fetch fallback 3.330M (± 4.7%) i/s - 16.618M
611+
612+
Comparison:
613+
Hash#[]: 6732624.6 i/s
614+
Hash#dig: 6252809.1 i/s - same-ish: difference falls within error
615+
Hash#[] fallback: 6209365.5 i/s - same-ish: difference falls within error
616+
Hash#fetch: 4499831.0 i/s - 1.50x slower
617+
Hash#fetch fallback: 3330397.7 i/s - 2.02x slower
618+
```
619+
594620
##### `Hash[]` vs `Hash#dup` [code](code/hash/bracket-vs-dup.rb)
595621

596622
Source: http://tenderlovemaking.com/2015/02/11/weird-stuff-with-hashes.html

code/hash/dig-vs-[]-vs-fetch.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
require 'benchmark/ips'
2+
3+
h = { a: { b: { c: { d: { e: "foo" } } } } }
4+
5+
Benchmark.ips do |x|
6+
x.report 'Hash#dig' do
7+
h.dig(:a, :b, :c, :d, :e)
8+
end
9+
10+
x.report 'Hash#[]' do
11+
h[:a][:b][:c][:d][:e]
12+
end
13+
14+
x.report 'Hash#[] fallback' do
15+
((((h[:a] || {})[:b] || {})[:c] || {})[:d] || {})[:e]
16+
end
17+
18+
x.report 'Hash#fetch' do
19+
h.fetch(:a).fetch(:b).fetch(:c).fetch(:d).fetch(:e)
20+
end
21+
22+
x.report 'Hash#fetch fallback' do
23+
h.fetch(:a, {}).fetch(:b, {}).fetch(:c, {}).fetch(:d, {}).fetch(:e, nil)
24+
end
25+
26+
x.compare!
27+
end

0 commit comments

Comments
 (0)