Author: ian
Date: Fri Jul 14 18:36:15 2017
New Revision: 320997
URL: https://svnweb.freebsd.org/changeset/base/320997

Log:
  Minor optimization: instead of converting between days and years using
  loops that start in 1970, assume most conversions are going to be for recent
  dates and use a precomputed number of days through the end of 2016.

Modified:
  head/sys/kern/subr_clock.c

Modified: head/sys/kern/subr_clock.c
==============================================================================
--- head/sys/kern/subr_clock.c  Fri Jul 14 18:13:54 2017        (r320996)
+++ head/sys/kern/subr_clock.c  Fri Jul 14 18:36:15 2017        (r320997)
@@ -97,6 +97,13 @@ static const int month_days[12] = {
        31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
 };
 
+/*
+ * Optimization: using a precomputed count of days between POSIX_BASE_YEAR and 
a
+ * recent year avoids lots of needless loop iterations in conversion.
+ * recent_base_days is the number of days through the end of recent_base_year.
+ */
+static const int recent_base_year = 2016;
+static const int recent_base_days = 17167;
 
 /*
  * This inline avoids some unnecessary modulo operations
@@ -157,8 +164,14 @@ clock_ct_to_ts(struct clocktime *ct, struct timespec *
         * Compute days since start of time
         * First from years, then from months.
         */
-       days = 0;
-       for (i = POSIX_BASE_YEAR; i < year; i++)
+       if (year > recent_base_year) {
+               i = recent_base_year;
+               days = recent_base_days;
+       } else {
+               i = POSIX_BASE_YEAR;
+               days = 0;
+       }
+       for (; i < year; i++)
                days += days_in_year(i);
 
        /* Months */
@@ -188,8 +201,14 @@ clock_ts_to_ct(struct timespec *ts, struct clocktime *
 
        ct->dow = day_of_week(days);
 
-       /* Subtract out whole years, counting them in i. */
-       for (year = POSIX_BASE_YEAR; days >= days_in_year(year); year++)
+       /* Subtract out whole years. */
+       if (days >= recent_base_days) {
+               year = recent_base_year + 1;
+               days -= recent_base_days;
+       } else {
+               year = POSIX_BASE_YEAR;
+       }
+       for (; days >= days_in_year(year); year++)
                days -= days_in_year(year);
        ct->year = year;
 
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to