Feature #4452
closedSpeedup Date._parse and Date._strptime by using a plain Hash
Description
=begin
This is pretty much a duplicate of #3667, but since you can't reopen tickets and I didn't get a response to the question I posted after it was closed, I'm resubmitting it.
Date._parse and Date._strptime currently use a Date::Format::Bag instance to hold some temporary data. This is a subclass of Date::Format::BagStruct which is a subclass of Struct. There are no other users of this class and it is a private (nodoc) class. It is much faster to switch the code to use a plain hash instead of Date::Format::Bag, 66% faster for Date._parse and 25% faster for Date._strptime:
$ ruby -v
ruby 1.9.3dev (2011-02-28 trunk 30975) [x86_64-openbsd4.9]
$ time ruby -r date -I date-struct -e "50000.times{Date._parse('2010-12-25')}"
real 0m3.673s
user 0m3.660s
sys 0m0.010s
$ time ruby -r date -I date-hash -e "50000.times{Date._parse('2010-12-25')}"
real 0m2.219s
user 0m2.200s
sys 0m0.020s
$ time ruby -r date -I date-struct -e "50000.times{Date._strptime('2010-12-25 10:20:30', '%F %T')}"
real 0m8.715s
user 0m8.710s
sys 0m0.000s
$ time ruby -r date -I date-hash -e "50000.times{Date._strptime('2010-12-25 10:20:30', '%F %T')}"
real 0m6.980s
user 0m6.970s
sys 0m0.000s
> 3.673/2.219
=> 1.655250112663362
> 8.715/6.980
=> 1.248567335243553
The only advantage to the current code is that you can use nicer looking accessor methods:
e.d # instead of e[:d]
e.d = 1 # instead of e[:d] = 1
However, in this case the performance increase greatly outweighs that issue.
=end
Files
Updated by jeremyevans0 (Jeremy Evans) about 13 years ago
- File date_format.patch date_format.patch added
=begin
The patch in #3667 pretty much applies except for the first hunk, so here's an updated patch against trunk.
=end
Updated by tadf (tadayoshi funaba) about 13 years ago
- Status changed from Open to Rejected
=begin
now i'm planning some improvements for formating method of date.
i may rewrite some methods in c.
thanks.
=end