From: Kurt Stephens Date: 2010-05-28T11:36:10+09:00 Subject: [ruby-core:30476] [Bug #3359] Date::Format::Bag performance improvement Bug #3359: Date::Format::Bag performance improvement http://redmine.ruby-lang.org/issues/show/3359 Author: Kurt Stephens Status: Open, Priority: Normal ruby -v: ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux] Date::Format::Bag spends a lot of time in method_missing for a limited number of method selectors. The hack below removed ~ 3% of time from a ActiveRecord/Rails app that parses and formats many Date objects.
class Date::Format::Bag
    def method_missing(sel, *args) # , &block)
      sel = sel.to_s
      t = sel.dup
      set = t.chomp!('=')
      t = t.intern
      if set
        value = @elem[t] = args[0]
        expr = "def #{sel}(arg); @elem[#{t.inspect}] = arg; end"
      else
        value = @elem[t]
        #
        # There appear to be no callers like:
        #
        #   e.foo(something)
        #
        # Thus do not interpret any arguments as
        # the *rest parameter creates Arrays that are
        # never referenced.
        #
        # expr = "def #{sel}(*rest); @elem[#{t.inspect}]; end"
        expr = "def #{sel}(); @elem[#{t.inspect}]; end"
      end
      expr = "class #{self.class}; #{expr}; end;"
      # $stderr.puts "  **** #{self.class}\##{sel} => #{expr}"
      eval(expr)
      value
    end
  end
Might be better to just enumerate all the possible Hash slot getter/setters using a simple class macro, since Date::Format::Bag is not used by anything outside of Date. ---------------------------------------- http://redmine.ruby-lang.org