Backport #3359
Updated by jeremyevans0 (Jeremy Evans) almost 5 years ago
=begin 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. <pre> 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 </pre> 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. =end