Skip to content

Instantly share code, notes, and snippets.

@gmarik

gmarik/code.rb Secret

Last active February 9, 2016 05:08
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gmarik/69e55f1dc28261f17aa4 to your computer and use it in GitHub Desktop.
Save gmarik/69e55f1dc28261f17aa4 to your computer and use it in GitHub Desktop.
immutable-vs-mutable? Both!
CAT_TO_ITEM_MAP = {
'numbers' => %w[0 1 2 3],
'letters' => %w[a b c d],
}
def items_to_categories_map_immutable
reducer = -> (acc, (cat, items)) do
items.reduce(acc) { |acc, item| acc.merge(item => cat) }
end
CAT_TO_ITEM_MAP.reduce({}, &reducer)
end
def items_to_categories_map_mutable
acc = {}
reducer = -> (cat, items) do
items.each { |item| acc[item] = cat }
end
CAT_TO_ITEM_MAP.each(&reducer)
acc
end
if __FILE__ == $0
require 'benchmark'
require 'test/unit'
include Test::Unit::Assertions
val = {
"0"=>"numbers",
"1"=>"numbers",
"2"=>"numbers",
"3"=>"numbers",
"a"=>"letters",
"b"=>"letters",
"c"=>"letters",
"d"=>"letters"
}
assert_equal val, items_to_categories_map_immutable
assert_equal val, items_to_categories_map_mutable
n = 500000
Benchmark.bm(10) do |x|
x.report("mutable") { n.times { items_to_categories_map_mutable } }
x.report("immutable") { n.times { items_to_categories_map_immutable } }
end
end
# $ ruby test.rb
# user system total real
# mutable 2.550000 0.390000 2.940000 ( 2.946557)
# immutable 7.900000 0.920000 8.820000 ( 8.842163)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment