Skip to content

Instantly share code, notes, and snippets.

@jdmorlan
Last active September 13, 2015 04:50
Show Gist options
  • Save jdmorlan/2c564064f2aa1950eb2b to your computer and use it in GitHub Desktop.
Save jdmorlan/2c564064f2aa1950eb2b to your computer and use it in GitHub Desktop.
require 'benchmark'
@inventory = []
@inventory << { :cat => "one" }
@inventory << { :cat => "one" }
@inventory << { :cat => "two" }
@inventory << { :cat => "two" }
def method_one(inventory)
inventory.inject({}) do |categories_hash, item|
if !categories_hash.has_key?(item[:cat])
categories_hash[item[:cat]] = []
end
categories_hash[item[:cat]].push(item)
categories_hash
end
end
def method_two(inventory)
inventory.inject({}) do |categories, item|
if !categories.has_key?(item[:cat])
categories[item[:cat]] = inventory.select { |i| i[:cat] == item[:cat] }
end
categories
end
end
def method_three(inventory)
inventory.group_by { |item| item[:cat] }
end
Benchmark.bm(7) do |x|
x.report("method_one (1000)") { 1000.times { method_one(@inventory) }}
x.report("method_two (1000)") { 1000.times { method_two(@inventory) }}
x.report("method_three (1000)") { 1000.times { method_three(@inventory) }}
puts "***************"
x.report("method_one (10,000)") { 10000.times { method_one(@inventory) }}
x.report("method_two (10,000)") { 10000.times { method_two(@inventory) }}
x.report("method_three (10,000)") { 10000.times { method_three(@inventory) }}
puts "***************"
x.report("method_one (100,000)") { 100000.times { method_one(@inventory) }}
x.report("method_two (100,000)") { 100000.times { method_two(@inventory) }}
x.report("method_three (100,000)") { 100000.times { method_three(@inventory) }}
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment