Last active
November 25, 2016 07:52
-
-
Save ignat-z/6779db323c64faf4ed89 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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