Skip to content

Instantly share code, notes, and snippets.

@ignat-z
Last active November 25, 2016 07:52
Show Gist options
  • Save ignat-z/6779db323c64faf4ed89 to your computer and use it in GitHub Desktop.
Save ignat-z/6779db323c64faf4ed89 to your computer and use it in GitHub Desktop.
def deep_blank?(hash)
hash.each do |k,v|
any_blank = v.is_a?(Hash) ? deep_blank?(v) : v.empty?
return false if !any_blank || k == '_destroy'
end
return true
end
def deep_blank(hash)
hashes = { hash: hash }
keys = [:hash]
while keys.size > 0 do
key = Array(keys.shift)
hash = key.inject(hashes, :fetch)
hash.each do |k,v|
if v.is_a?(Hash)
keys << (key + [k])
else
return false unless v.empty?
end
end
end
return true
end
deep_hash = {
a: '',
b: '',
c: { d: '', e: '' },
f: { g: '', h: { j: '' } },
k: { l: '', m: { n: { o: '' } } },
p: { q: '', r: '', s: { t: { u: { w: ''} } } }
}
deep_hash_with_value = {
a: '',
b: '',
c: { d: '', e: '' },
f: { g: '', h: { j: '' } },
k: { l: '', m: { n: { o: "some_passed_value" } } },
p: { q: '', r: '', s: { t: { u: { w: ''} } } }
}
require 'benchmark/ips'
Benchmark.ips do |x|
x.report("recursion") { deep_blank?(deep_hash) }
x.report("stack") { deep_blank(deep_hash) }
x.compare!
end
Benchmark.ips do |x|
x.report("recursion with value") { deep_blank?(deep_hash_with_value) }
x.report("stack with value") { deep_blank(deep_hash_with_value) }
x.compare!
end
#
# Warming up --------------------------------------
# recursion 14.700k i/100ms
# stack 6.990k i/100ms
# Calculating -------------------------------------
# recursion 156.470k (± 4.0%) i/s - 793.800k in 5.081689s
# stack 70.396k (± 8.3%) i/s - 349.500k in 5.004201s
# Comparison:
# recursion: 156469.9 i/s
# stack: 70396.3 i/s - 2.22x slower
# Warming up --------------------------------------
# recursion with value 21.617k i/100ms
# stack with value 8.396k i/100ms
# Calculating -------------------------------------
# recursion with value 226.315k (± 6.2%) i/s - 1.146M in 5.082810s
# stack with value 88.074k (± 3.5%) i/s - 444.988k in 5.058501s
# Comparison:
# recursion with value: 226314.6 i/s
# stack with value: 88073.7 i/s - 2.57x slower
#
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment