Add benchmark for Hash#dig vs #[] vs #fetch#102
Add benchmark for Hash#dig vs #[] vs #fetch#102dideler wants to merge 3 commits intofastruby:masterfrom
Conversation
| end | ||
|
|
||
| x.report 'Hash#[] fallback' do | ||
| ((((h[:a] || {})[:b] || {})[:c] || {})[:d] || {})[:e] |
There was a problem hiding this comment.
ouch, do people ever really do it this way? far more common I think is:
h[:a] && h[:a][:b] && ## etcThere was a problem hiding this comment.
I'm not sure which way is more common. Should I use one example over the other or include both?
There was a problem hiding this comment.
Actually, I think, the way proposed by @nateberkopec is more effective in case when none of the keys are exists, because you don't need to create all of these hashes.
There was a problem hiding this comment.
I've added the more common style to the benchmark, see 95b8ea4
| end | ||
|
|
||
| x.report 'Hash#fetch fallback' do | ||
| h.fetch(:a, {}).fetch(:b, {}).fetch(:c, {}).fetch(:d, {}).fetch(:e, nil) |
There was a problem hiding this comment.
fetch(:a, {}) creates new object EVERY time even when it's not needed.
More appropriate would be:
h.fetch(:a) { {} }.fetch(:b) { {} }...There was a problem hiding this comment.
Your notation will create Procs for every #fetch. That maybe faster or not. Seems that's another test… :)
There was a problem hiding this comment.
@ixti I'd like to keep it as is because I see the current approach more often.
There was a problem hiding this comment.
@mblumtritt in fact it will not. Why would it create Proc?
In any case, @dideler I tend to agree that probably some people use fetch(key, {}).
And that looks pretty fine, but in this case it worth to "cache" that object:
o = {}
h.fetch(:a, o).fetch(:b, o)That's just my thoughts. I don't insist on anything :D
|
More interesting would be to compare H = { :a => { :b => { :d => true } } }
H.dig(:a, :b, :c, :d) # => nil
H[:a] && H[:a][:b] && H[:a][:b][:c] && H[:a][:b][:c][:d] # => nil |
I find the safe path most interesting because you can compare more options, but here are all cases. Safe: Broken at last key: Broken at intermediate key:
|
|
@dideler I'm absolutely agree that |
73b2c8d to
437d8f8
Compare
|
👍, how's 437d8f8? |
|
LGTM! 👍 |
|
Thanks @JuanitoFatas - I would love to be a collaborator! |
Yay! ❤️ |
Comparison of how Ruby 2.3.0's
Hash#digperforms to similar methods.Unsafe retrieval options are included. I can remove them if you consider them noisy.