From: tadayoshi funaba Date: 2011-03-02T21:02:04+09:00 Subject: [ruby-core:35415] [Ruby 1.9 - Feature #4068] [Rejected] Replace current standard Date/DateTime library with home_run Issue #4068 has been updated by tadayoshi funaba. Status changed from Assigned to Rejected ---------------------------------------- Feature #4068: Replace current standard Date/DateTime library with home_run http://redmine.ruby-lang.org/issues/4068 Author: Jeremy Evans Status: Rejected Priority: Low Assignee: tadayoshi funaba Category: Target version: The current standard date library is slow enough to be the bottleneck in many programs. I have written a replacement for it in C (named home_run) that is much faster while attempting to be mostly compatible. I open this ticket in the hope that home_run can replace the current standard date library in a future version of ruby. First, the code is at: https://github.com/jeremyevans/home_run As it states in the README, here are the known differences from the current standard library: * Written in C (mostly) instead of ruby. Stores information in a C structure, and therefore has a range limitation. home_run cannot handle dates after 5874773-08-15 or before -5877752-05-08 on 32-bit platforms (with larger limits for 64-bit platforms). * The Date class does not store fractional days (e.g. hours, minutes), or offsets. The DateTime class does handle fractional days and offsets. * The DateTime class stores fractional days as the number of nanoseconds since midnight, so it cannot deal with differences less than a nanosecond. * Neither Date nor DateTime uses rational. Places where the standard library returns rationals, home_run returns integers or floats. * Because rational is not used, it is not required. This can break other libraries that use rational without directly requiring it. * There is no support for modifying the date of calendar reform, the sg arguments are ignored and the Gregorian calendar is always used. This means that julian day 0 is -4173-11-24, instead of -4712-01-01. * The undocumented Date#strftime format modifiers are not supported. * The DateTime offset is checked for reasonableness. home_run does not support offsets with an absolute difference of more than 14 hours from UTC. * DateTime offsets are stored in minutes, so it will round offsets with fractional minutes to the nearest minute. * All public class and instance methods for both Date and DateTime are implemented, except that the allocate class method is not available and on 1.9, _dump and _load are used instead of marshal_dump and marshal_load. * Only the public API is compatible, the private methods in the standard library are not implemented. * The marshalling format differs from the one used by the standard library. Note that the 1.8 and 1.9 standard library date marshalling formats differ from each other. * Date#step treats the step value as an integer, so it cannot handle steps of fractional days. DateTime#step can handle fractional day steps, though. * When parsing the %Q modifier in _strptime, the hash returned includes an Integer :seconds value and a Float :sec_fraction value instead of a single rational :seconds value. * The string returned by #inspect has a different format, since it doesn't use rational. * The conversion of 2-digit years to 4-digit years in Date._parse is set to true by default. On ruby 1.8, the standard library has it set to false by default. * You can use the Date::Format::STYLE hash to change how to parse DD/DD/DD and DD.DD.DD date formats, allowing you to get ruby 1.9 behavior on 1.8 or vice-versa. This is probably the only new feature in that isn't in the standard library. From previous discussions on ruby-core, the following things will probably need to be changed before home_run could replace the current standard date library: * The marshalling format needs to be made compatible with the current standard library. * The specs needs to be converted from MSpec to minitest/spec for inclusion in ruby. * The RubySpec project also needs to have the MSpecs added, with the appropriate version guards where behavior has changed. * Where home_run now returns floats, it should return rationals instead. I'm willing to make these changes and other reasonable changes in order to get this included in ruby. I just need to know what all of the required changes are. -- http://redmine.ruby-lang.org