From: Jeremy Evans Date: 2010-08-08T10:41:04+09:00 Subject: [ruby-core:31649] [Feature #3667] Speedup Date._parse and Date._strptime by using a Hash instead of a Date::Format::Bag Feature #3667: Speedup Date._parse and Date._strptime by using a Hash instead of a Date::Format::Bag http://redmine.ruby-lang.org/issues/show/3667 Author: Jeremy Evans Status: Open, Priority: Normal Category: lib In date/format.rb, the Date::Format::Bag helper class is used to get a slightly nicer internal API, but it has a significant performance cost. This patch is a fairly mechanical change to using a plain Hash instead of a Date::Format::Bag (which it removes). For the following test code, I'm getting a 53% performance increase for Date._parse and a 24% increase for Date_.strptime. $ ruby -v ruby 1.9.2dev (2010-07-11 revision 28618) [x86_64-openbsd4.7] Date._parse ----------- $ cat date_parse.rb require 'date' m = Date.method(:_parse) d = '2010-10-20 18:43:46+08:00' 10000.times{m.call(d)} $ time ruby date_parse.rb real 0m1.217s user 0m1.130s sys 0m0.050s $ time ruby -I date2 date_parse.rb real 0m0.793s user 0m0.760s sys 0m0.030s Date._strptime: $ cat date_strptime.rb require 'date' m = Date.method(:_strptime) d = '2010-10-20 18:43:46+08:00' s = '%Y-%m-%d %H:%M:%S%z' 10000.times{m.call(d, s)} $ time ruby date_strptime.rb real 0m1.984s user 0m1.980s sys 0m0.000s $ time ruby -I date2 date_strptime.rb real 0m1.595s user 0m1.550s sys 0m0.040s This patch should operate identically to the current version except that it may include keys with nil values in the returned hashes (I'm not sure that it does, but there is no check against it). If that isn't acceptable, there's two options. There could be a Hash#delete_if call to remove things with nil values (easier, probably worse performance), or the internal code to be modified to never assign nil values to the hash (possibly slightly more work, probably better performance). In either case I'd be happy to do the work. ---------------------------------------- http://redmine.ruby-lang.org