On Sun, May 25, 2014 at 01:48:44PM -0400, David T. Lewis wrote:
I have been working on a variation of class DateAndTime that replaces its instance variables (seconds offset jdn nanos) with two instance variables, utcMicroseconds to represent microseconds elapsed since the Posix epoch, and localOffsetSeconds to represent the local time zone offset. When instantiating the time now, A single call primitiveUtcWithOffset is used to obtain these two values atomically as reported by the underlying platform.
I originally posted this as email to squeak-dev a couple of months ago. I have now added a page for it on the swiki at http://wiki.squeak.org/squeak/6197 with the original SAR file attached. I have also put the code into Monticello on SS3 at http://ss3.gemstone.com/ss/UTCDateAndTime. The SS3 repository has a few minor updates since my original posting.
The SS3 archive has MCM update maps that, if loaded in sequence, can be used to update a Squeak trunk image from the repository.
I'll probably put this on SqueakMap also, if I can find a nice way to do the the updates for an arbitrary image. This is a tricky business, because instances of DateAndTime need to change at the same time that the Monticello loader is making heavy use of DateAndTime to load the MCZs. A good old fashioned SAR is the safest way to handle it, but Monticello is probably more approachable for most of us.
Dave
There are several advantages to this representation of DateAndTime, the most important of which is that its magnitude is unambiguous regardless of daylight savings transitions in local time zones.
This is my attempt to address some historical baggage in Squeak. The VM reports time related to the local time zone, and the image attempts to convert to UTC (sometimes incorrectly). A UTC based representation makes the implementation of time zone tables more straightforward (see for example the Olson time zone tables in TimeZoneDatabase on SqueakMap).
I am attaching the source code as a SAR file that can be loaded into a fully updated Squeak trunk image. The conversion process is slow, so be patient if you load it.
This can be run on either an intepreter VM or Cog, but if you use Cog, please use a version dated June 2013 or later (the VM in the Squeak 4.5 all-in-one is fine).
I am also attaching a copy of LXTestDateAndTimePerformance, which can be used to compare the performance of some basic DateAndTime functions.
Performance of the UTC based DateAndTime is generally favorable compared to the original. Here is what I see on my system (smaller numbers are better).
LXTestDateAndTimePerformance test results using the original Squeak DateAndTime on an interpreter VM: { #testNow->10143 . #testEquals->30986 . #testGreaterThan->80199 . #testLessThan->75912 . #testPrintString->10429 . #testStringAsDateAndTime->44657 }
LXTestDateAndTimePerformance test results using the new UTC based DateAndTime on an interpreter VM: { #testNow->6423 . #testEquals->31625 . #testGreaterThan->22999 . #testLessThan->18514 . #testPrintString->12502 . #testStringAsDateAndTime->32912 }
(CC to Brent Pinkney, author of the excellent Squeak Chronology package)
Dave