Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 14 Jul 2017 18:36:15 +0000 (UTC)
From:      Ian Lepore <ian@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r320997 - head/sys/kern
Message-ID:  <201707141836.v6EIaF8R015055@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
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;
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201707141836.v6EIaF8R015055>