Skip to content

Instantly share code, notes, and snippets.

@leandro
Created June 2, 2010 04:12
Show Gist options
  • Select an option

  • Save leandro/421918 to your computer and use it in GitHub Desktop.

Select an option

Save leandro/421918 to your computer and use it in GitHub Desktop.
require 'benchmark'
class Hash
def hash_from_1(*keys)
keys.inject({}) { |memo, obj| memo.merge(obj => self[obj]) }
end
def hash_from_2(*keys)
self.dup.delete_if { |k, v| !keys.include? k }
end
def hash_from_3(*keys)
Hash[keys.zip(self.values_at(*keys))]
end
end
Benchmark.bm(7) do |b|
hash = {:foo => 1, :bar => 2, :foorbar => 3}
b.report('leandro:') { 100_000.times { hash.hash_from_1(:foo, :bar) } }
b.report('cassio :') { 100_000.times { hash.hash_from_2(:foo, :bar) } }
b.report('caio :') { 100_000.times { hash.hash_from_3(:foo, :bar) } }
end
#@@@!leandro@mandigal:~!: ruby tmp/hash_from.rb
# user system total real
#leandro: 0.740000 0.000000 0.740000 ( 0.745478)
#cassio : 0.500000 0.000000 0.500000 ( 0.499253)
#caio : 0.310000 0.000000 0.310000 ( 0.314024)
#@@@!leandro@mandigal:~!: ruby tmp/hash_from.rb
# user system total real
#leandro: 0.750000 0.000000 0.750000 ( 0.752957)
#cassio : 0.490000 0.000000 0.490000 ( 0.499744)
#caio : 0.310000 0.000000 0.310000 ( 0.311485)
#@@@!leandro@mandigal:~!: ruby tmp/hash_from.rb
# user system total real
#leandro: 0.750000 0.000000 0.750000 ( 0.754807)
#cassio : 0.500000 0.010000 0.510000 ( 0.507627)
#caio : 0.310000 0.000000 0.310000 ( 0.316764)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment