bogdanrada
2/26/2013 - 9:45 PM

Benchmarking OpenStruct alternatives

Benchmarking OpenStruct alternatives

require 'benchmark'
require 'ostruct'
require 'rubygems'
require 'deep_struct'
require 'classy_struct'
require 'structure'
require 'deepopenstruct'
require 'recursive-open-struct'
require './fast_struct/lib/fast_struct'

REP = 100000

GET = ENV['GET']

Benchmark.bm 20 do |x|
  
  x.report 'FastStruct' do
    REP.times do |index|
      h = FastStruct.new(:name => "User", :age => 21)
      100.times { h.name } if GET
    end
  end  

  x.report 'Plain ol Hash' do
    REP.times do |index|
      h = Hash.new(:name => "User", :age => 21)
      100.times { h[:name] } if GET
    end
  end  
 
  x.report 'Struct' do
    REP.times do |index|
      user = Struct.new(:name, :age)      
      h = user.new("User", 21)
      100.times { h.name } if GET      
    end
  end
  
  x.report 'OpenStruct' do
    REP.times do |index|
      h = OpenStruct.new(:name => "User", :age => 21)
      100.times { h.name } if GET
    end
  end
  
  x.report 'Structure' do
    REP.times do |index|
      h = Structure.new(:name => "User", :age => 21)
      100.times { h.name } if GET
    end
  end

  x.report 'RecursiveOpenStruct' do
    REP.times do |index|
      h = RecursiveOpenStruct.new(:name => "User", :age => 21)
      100.times { h.name } if GET
    end
  end
  
  x.report 'DeepStruct' do
    REP.times do |index|
      h = DeepStruct.from_data(:name => "User", :age => 21)
      100.times { h.name } if GET
    end
  end

  x.report 'ClassyStruct' do
    REP.times do |index|
      classy = ClassyStruct.new
      h = classy.new(:name => "User", :age => 21)      
      100.times { h.name } if GET      
    end
  end  
  
  x.report 'DeepOpenStruct' do
    REP.times do |index|
      h = DeepOpenStruct.load(:name => "User", :age => 21)
      100.times { h.name } if GET
    end
  end
end