Feature #3667
closedSpeedup Date._parse and Date._strptime by using a Hash instead of a Date::Format::Bag
Description
=begin
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.
=end
Files