Greetings

I've ran into some performance trouble using define_method. 

Benchmarking gives:

With    define_method:  1 second
Without define_method: 21 seconds


Question:

Is this to be expected, or am I doing something totally or partially
wrong? 

Hints, comments, links, everything is appreciated.


All the best
Jon Egil Strand




The benchmark code is as follows: 


----------------------

class Staticperson
  def initialize(personalia)
    @firstname = personalia[:firstname]
    @surname = personalia[:surname]
    @country = personalia[:country]
  end
  
  attr_reader :firstname, :surname, :country
end


class Dynamicperson
  def initialize(personalia)    
    @personalia = personalia
    @personalia .each_key do |k|      
      self.class.send(:define_method, k) { @personalia[k] }
    end
  end
end


peter = {:firstname => "Peter",
         :surname => "Pan", 
	 :country => "Neverland"}



COUNT = 100_000

require 'benchmark'

Benchmark.bmbm do |test|
  test.report("Static: ") do
    COUNT.times do        
      s_peter = Staticperson.new(peter)
      s_peter.firstname
      s_peter.surname
      s_peter.country
    end
  end
  test.report("Dynamic: ") do
    COUNT.times do        
      d_peter = Dynamicperson.new(peter)
      d_peter.firstname
      d_peter.surname
      d_peter.country      
    end
  end
end

----------------------

And the full results goes like this:

Rehearsal ---------------------------------------------
Static:     0.984000   0.047000   1.031000 (  1.047000)
Dynamic:   21.766000   0.094000  21.860000 ( 21.906000)
----------------------------------- total: 22.891000sec

                user     system      total        real
Static:     1.031000   0.000000   1.031000 (  1.031000)
Dynamic:   21.375000   0.109000  21.484000 ( 21.500000)



(Sorry for the naming, I know it's not _static_ per se, but it was a 
useful label at the time :-) )