RtlTimeToTimeFields: speedup
Huw D M Davies
h.davies1 at physics.ox.ac.uk
Mon Feb 23 11:30:15 CST 2004
Huw Davies <huw at codeweavers.com>
Speed up RtlTimeToTimeFields
--
Huw Davies
huw at codeweavers.com
Index: dlls/ntdll/time.c
===================================================================
RCS file: /home/wine/wine/dlls/ntdll/time.c,v
retrieving revision 1.36
diff -u -r1.36 time.c
--- dlls/ntdll/time.c 23 Jan 2004 01:51:34 -0000 1.36
+++ dlls/ntdll/time.c 23 Feb 2004 17:25:23 -0000
@@ -272,6 +272,9 @@
#define DAYSPERNORMALYEAR 365
#define DAYSPERLEAPYEAR 366
#define MONSPERYEAR 12
+#define DAYSPERQUADRICENTENNIUM (365 * 400 + 97)
+#define DAYSPERNORMALCENTURY (365 * 100 + 24)
+#define DAYSPERNORMALQUADRENNIUM (365 * 4 + 1)
/* 1601 to 1970 is 369 years plus 89 leap days */
#define SECS_1601_TO_1970 ((369 * 365 + 89) * (ULONGLONG)SECSPERDAY)
@@ -350,7 +353,7 @@
PTIME_FIELDS TimeFields)
{
const int *Months;
- int SecondsInDay, CurYear;
+ int SecondsInDay, DeltaYear;
int LeapYear, CurMonth;
long int Days;
LONGLONG Time = liTime->QuadPart;
@@ -376,17 +379,22 @@
TimeFields->Weekday = (CSHORT) ((EPOCHWEEKDAY + Days) % DAYSPERWEEK);
/* compute year */
- CurYear = EPOCHYEAR;
/* FIXME: handle calendar modifications */
- while (1)
- { LeapYear = IsLeapYear(CurYear);
- if (Days < (long) YearLengths[LeapYear])
- { break;
- }
- CurYear++;
- Days = Days - (long) YearLengths[LeapYear];
- }
- TimeFields->Year = (CSHORT) CurYear;
+ TimeFields->Year = EPOCHYEAR;
+ DeltaYear = Days / DAYSPERQUADRICENTENNIUM;
+ TimeFields->Year += DeltaYear * 400;
+ Days -= DeltaYear * DAYSPERQUADRICENTENNIUM;
+ DeltaYear = Days / DAYSPERNORMALCENTURY;
+ TimeFields->Year += DeltaYear * 100;
+ Days -= DeltaYear * DAYSPERNORMALCENTURY;
+ DeltaYear = Days / DAYSPERNORMALQUADRENNIUM;
+ TimeFields->Year += DeltaYear * 4;
+ Days -= DeltaYear * DAYSPERNORMALQUADRENNIUM;
+ DeltaYear = Days / DAYSPERNORMALYEAR;
+ TimeFields->Year += DeltaYear;
+ Days -= DeltaYear * DAYSPERNORMALYEAR;
+
+ LeapYear = IsLeapYear(TimeFields->Year);
/* Compute month of year */
Months = MonthLengths[LeapYear];
More information about the wine-patches
mailing list