Skip to content

Instantly share code, notes, and snippets.

@revans
Created March 5, 2010 18:29
Show Gist options
  • Save revans/322993 to your computer and use it in GitHub Desktop.
Save revans/322993 to your computer and use it in GitHub Desktop.
require 'rubygems'
require 'mash'
require 'hashie'
gem 'activesupport', '2.3.5'
require 'active_support'
require "benchmark"
include Benchmark
bm(10) do |test|
test.report("Using Mash") do
Mash.new({
:names => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:cities => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
:a => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:b => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
:c => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:d => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
:e => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:f => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}]
})
end
test.report("Using Hashie for a more complex hash") do
Hashie::Mash.new({
:names => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:cities => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
:a => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:b => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
:c => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:d => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
:e => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:f => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}]
})
end
test.report("Using a hash") do
hash = {
:names => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:cities => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
:a => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:b => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
:c => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:d => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
:e => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:f => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}]
}
end
test.report("Using Hash with indifferent access") do
HashWithIndifferentAccess.new({
:names => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:cities => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
:a => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:b => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
:c => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:d => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
:e => [{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
:f => [{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}]
})
end
test.report("Using a Struct") do
Demo = Struct.new(:names, :cities, :a, :b, :c, :d, :e, :f)
Demo.new(
[{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
[{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
[{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
[{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
[{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
[{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}],
[{:name => "Smith"}, {:name => "Johnson"}, {:name => "Evans"}, {:name => "Bradford"}],
[{:name => "Carlsbad"}, {:name => "Oceanside"}, {:name => "San Marcos"}, {:name => "Vista"}, {:name => "San Diego"}]
)
end
test.report("Simple Hash") do
hash = {
:a => {:first => "John", :last => 'Smith'},
:b => {:first => "John", :last => 'Smith'},
:c => {:first => "John", :last => 'Smith'},
:d => {:first => "John", :last => 'Smith'},
:e => {:first => "John", :last => 'Smith'},
:f => {:first => "John", :last => 'Smith'},
:g => {:first => "John", :last => 'Smith'},
:h => {:first => "John", :last => 'Smith'}
}
end
test.report("Simple hash to mash") do
Mash.new({
:a => {:first => "John", :last => 'Smith'},
:b => {:first => "John", :last => 'Smith'},
:c => {:first => "John", :last => 'Smith'},
:d => {:first => "John", :last => 'Smith'},
:e => {:first => "John", :last => 'Smith'},
:f => {:first => "John", :last => 'Smith'},
:g => {:first => "John", :last => 'Smith'},
:h => {:first => "John", :last => 'Smith'}
})
end
test.report("Simple hash to hashie") do
Hashie::Mash.new({
:a => {:first => "John", :last => 'Smith'},
:b => {:first => "John", :last => 'Smith'},
:c => {:first => "John", :last => 'Smith'},
:d => {:first => "John", :last => 'Smith'},
:e => {:first => "John", :last => 'Smith'},
:f => {:first => "John", :last => 'Smith'},
:g => {:first => "John", :last => 'Smith'},
:h => {:first => "John", :last => 'Smith'}
})
end
test.report("Simple hash to struct") do
Acme = Struct.new(:a, :b, :c, :d, :e, :f, :g, :h)
Acme.new(
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'}
)
end
test.report("Simple hash to Hash with indifferent access") do
HashWithIndifferentAccess.new({
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'},
{:first => "John", :last => 'Smith'}
})
end
end
#####################################################################
### BASED OF A HASH WITH ARRAYS OF HASHES ###
# -------------------------------------------------------------------
## Using a Hash
#
# user system total real
# 0.000000 0.000000 0.000000 ( 0.000044)
# 0.000000 0.000000 0.000000 ( 0.000035)
# 0.000000 0.000000 0.000000 ( 0.000035)
#
# -------------------------------------------------------------------
## Using a Mash
#
# user system total real
# 0.010000 0.000000 0.010000 ( 0.001619)
# 0.010000 0.000000 0.010000 ( 0.001521)
# 0.000000 0.000000 0.000000 ( 0.001674)
#
# -------------------------------------------------------------------
## Using a Hashie
#
# user system total real
# 0.000000 0.000000 0.000000 ( 0.000268)
# 0.000000 0.000000 0.000000 ( 0.000265)
# 0.000000 0.000000 0.000000 ( 0.000267)
#
# -------------------------------------------------------------------
## Using a Hash with Indifferent Access (via active support)
#
# user system total real
# 0.000000 0.000000 0.000000 ( 0.000308)
# 0.000000 0.000000 0.000000 ( 0.000382)
# 0.000000 0.000000 0.000000 ( 0.000313)
#
# -------------------------------------------------------------------
## Using Struct
#
# user system total real
# 0.000000 0.000000 0.000000 ( 0.000133)
# 0.000000 0.000000 0.000000 ( 0.000140)
# 0.000000 0.000000 0.000000 ( 0.000171)
#
#####################################################################
#####################################################################
### BASED OF A SIMPLE HASH ###
# -------------------------------------------------------------------
## Using a Hash
#
# user system total real
# 0.000000 0.000000 0.000000 ( 0.000016)
# 0.000000 0.000000 0.000000 ( 0.000018)
# 0.000000 0.000000 0.000000 ( 0.000017)
#
# -------------------------------------------------------------------
## Using a Mash
#
# user system total real
# 0.000000 0.000000 0.000000 ( 0.000684)
# 0.000000 0.000000 0.000000 ( 0.000558)
# 0.010000 0.000000 0.010000 ( 0.000564)
#
# -------------------------------------------------------------------
## Using Hashie
#
# user system total real
# 0.000000 0.000000 0.000000 ( 0.000107)
# 0.000000 0.000000 0.000000 ( 0.000108)
# 0.000000 0.000000 0.000000 ( 0.000208)
#
# -------------------------------------------------------------------
## Using a Hash with Indifferent Access (via active support)
#
# user system total real
# 0.000000 0.000000 0.000000 ( 0.000043)
# 0.000000 0.000000 0.000000 ( 0.000043)
# 0.000000 0.000000 0.000000 ( 0.000042)
#
# -------------------------------------------------------------------
## Using Struct
#
# user system total real
# 0.000000 0.000000 0.000000 ( 0.000108)
# 0.000000 0.000000 0.000000 ( 0.000107)
# 0.000000 0.000000 0.000000 ( 0.000118)
#
#####################################################################
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment