1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
|
$:.unshift "../lib"
require 'benchmark'
require 'needle'
ITERATIONS = 100_000
S = Struct.new( :value )
registry = Needle::Registry.new
registry.register( :immediate, :model=>:prototype ) { S.new }
registry.register( :deferred, :model=>:prototype_deferred ) { S.new }
puts
puts "--------------------------------------------------------------------"
puts "Direct vs. Immediate vs. Deferred instantiation (trivial)"
puts "#{ITERATIONS} iterations"
puts
Benchmark.bm(10) do |x|
GC.disable
x.report( "direct:" ) { ITERATIONS.times { S.new } }
GC.start
x.report( "immediate:" ) { ITERATIONS.times { registry.immediate } }
GC.start
x.report( "deferred:" ) { ITERATIONS.times { registry.deferred } }
GC.start
x.report( "deferred*:" ) { ITERATIONS.times { registry.deferred.value } }
GC.enable
end
puts "* this benchmark forced the proxy to instantiate its wrapped service"
puts
class S2
def initialize
@h = Hash.new
@h[:one] = :two
@h[:two] = :three
@h[:three] = :four
10.times { @h[:one] }
end
def value
@h
end
end
registry = Needle::Registry.new
registry.register( :immediate, :model=>:prototype ) { S2.new }
registry.register( :deferred, :model=>:prototype_deferred ) { S2.new }
puts
puts "--------------------------------------------------------------------"
puts "Direct vs. Immediate vs. Deferred instantiation (non-trivial)"
puts "#{ITERATIONS} iterations"
puts
Benchmark.bm(10) do |x|
GC.disable
x.report( "direct:" ) { ITERATIONS.times { S2.new } }
GC.start
x.report( "immediate:" ) { ITERATIONS.times { registry.immediate } }
GC.start
x.report( "deferred:" ) { ITERATIONS.times { registry.deferred } }
GC.start
x.report( "deferred*:" ) { ITERATIONS.times { registry.deferred.value } }
GC.enable
end
puts "* this benchmark forced the proxy to instantiate its wrapped service"
puts
|