svn commit: r320997 - head/sys/kern
Ian Lepore
ian at FreeBSD.org
Fri Jul 14 18:36:16 UTC 2017
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;
More information about the svn-src-head
mailing list