Project

General

Profile

Actions

Feature #4068

closed

Replace current standard Date/DateTime library with home_run

Added by jeremyevans0 (Jeremy Evans) over 14 years ago. Updated about 14 years ago.

Status:
Rejected
Target version:
-
[ruby-core:33246]

Description

=begin
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.
=end


Files

stolen_base.patch (13.5 KB) stolen_base.patch tadf (tadayoshi funaba), 11/27/2010 09:05 AM
stolen_base.patch2 (13.5 KB) stolen_base.patch2 tadf (tadayoshi funaba), 11/28/2010 11:46 AM
bm.rb (1.47 KB) bm.rb tadf (tadayoshi funaba), 11/28/2010 11:46 AM
switch_hitter.patch (39.3 KB) switch_hitter.patch tadf (tadayoshi funaba), 12/04/2010 10:03 AM
bm2.rb (663 Bytes) bm2.rb tadf (tadayoshi funaba), 12/04/2010 10:03 AM
switch_hitter.patch (39.3 KB) switch_hitter.patch tadf (tadayoshi funaba), 12/04/2010 10:05 AM
bm2.rb (663 Bytes) bm2.rb tadf (tadayoshi funaba), 12/04/2010 10:05 AM

Related issues 1 (0 open1 closed)

Related to Ruby - Feature #4257: switch_hitter - an acceleration of date libraryClosedtadf (tadayoshi funaba)01/10/2011Actions
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0Like0