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