foo = Foo1.new
foo.build1 :a, :b
foo.a = 1
foo.a
foo = Foo1.new
foo.build2 :a, :b
foo.a = 1
foo.a
foo = Foo2.new
foo.a = 1
foo.a
foo = STRUCT.new
foo.a = 1
foo.a
Benchmark for fun on my extremly slow computer (@work)...
foo = Foo1.new
foo.build1 :a, :b
foo.a = 1
foo.a
foo = Foo1.new
foo.build2 :a, :b
foo.a = 1
foo.a
foo = Foo2.new
foo.a = 1
foo.a
foo = STRUCT.new
foo.a = 1
foo.a
Benchmark for fun on my extremly slow computer (@work)...
| require 'benchmark' | |
| require 'benchmark/ips' | |
| load './instance_with_dynamic_accessor.rb' | |
| Benchmark.ips do |x| | |
| x.report("singleton_class") do | |
| foo = Foo1.new | |
| foo.build1 :a, :b | |
| foo.a = 1 | |
| foo.a | |
| end | |
| x.report("send") do | |
| foo = Foo1.new | |
| foo.build2 :a, :b | |
| foo.a = 1 | |
| foo.a | |
| end | |
| x.report("open_struct") do | |
| foo = Foo2.new | |
| foo.a = 1 | |
| foo.a | |
| end | |
| x.report("struct") do | |
| struct = Struct.new :a, :b | |
| foo = struct.new | |
| foo.a = 1 | |
| foo.a | |
| end | |
| end |
| # Make it yourself | |
| class Foo1 | |
| def build1(*args) | |
| singleton_class.class_eval do | |
| attr_accessor *args | |
| end | |
| end | |
| def build2(*args) | |
| self.class.__send__ :attr_accessor, *args | |
| end | |
| end | |
| # OpenStruct | |
| require 'ostruct' | |
| class Foo2 < OpenStruct | |
| end | |
| # Struct | |
| att = [:a, :b] | |
| STRUCT = Struct.new *att |
| Calculating ------------------------------------- | |
| singleton_class 9595 i/100ms | |
| send 9920 i/100ms | |
| open_struct 5868 i/100ms | |
| struct 7343 i/100ms | |
| ------------------------------------------------- | |
| singleton_class 127811.0 (±7.2%) i/s - 642865 in 5.058452s | |
| send 124758.9 (±17.2%) i/s - 615040 in 5.071965s | |
| open_struct 68718.4 (±4.1%) i/s - 346212 in 5.046394s | |
| struct 87365.2 (±15.9%) i/s - 425894 in 5.076300s |