Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Aug 2012 09:08:20 +0000 (UTC)
From:      Alexander Motin <mav@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r239005 - head/sys/kern
Message-ID:  <201208030908.q7398Kbf093085@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: mav
Date: Fri Aug  3 09:08:20 2012
New Revision: 239005
URL: http://svn.freebsd.org/changeset/base/239005

Log:
  Microoptimize time math.  As soon as our event periods are always below ome
  second we may not add intereger parts by using bintime_addx() instead of
  bintime_add().  Profiling shows handleevents() time redction by 15%.

Modified:
  head/sys/kern/kern_clocksource.c

Modified: head/sys/kern/kern_clocksource.c
==============================================================================
--- head/sys/kern/kern_clocksource.c	Fri Aug  3 05:39:32 2012	(r239004)
+++ head/sys/kern/kern_clocksource.c	Fri Aug  3 09:08:20 2012	(r239005)
@@ -205,19 +205,21 @@ handleevents(struct bintime *now, int fa
 
 	runs = 0;
 	while (bintime_cmp(now, &state->nexthard, >=)) {
-		bintime_add(&state->nexthard, &hardperiod);
+		bintime_addx(&state->nexthard, hardperiod.frac);
 		runs++;
 	}
-	if ((timer->et_flags & ET_FLAGS_PERCPU) == 0 &&
-	    bintime_cmp(&state->nexthard, &nexthard, >))
-		nexthard = state->nexthard;
-	if (runs && fake < 2) {
-		hardclock_cnt(runs, usermode);
-		done = 1;
+	if (runs) {
+		if ((timer->et_flags & ET_FLAGS_PERCPU) == 0 &&
+		    bintime_cmp(&state->nexthard, &nexthard, >))
+			nexthard = state->nexthard;
+		if (fake < 2) {
+			hardclock_cnt(runs, usermode);
+			done = 1;
+		}
 	}
 	runs = 0;
 	while (bintime_cmp(now, &state->nextstat, >=)) {
-		bintime_add(&state->nextstat, &statperiod);
+		bintime_addx(&state->nextstat, statperiod.frac);
 		runs++;
 	}
 	if (runs && fake < 2) {
@@ -227,7 +229,7 @@ handleevents(struct bintime *now, int fa
 	if (profiling) {
 		runs = 0;
 		while (bintime_cmp(now, &state->nextprof, >=)) {
-			bintime_add(&state->nextprof, &profperiod);
+			bintime_addx(&state->nextprof, profperiod.frac);
 			runs++;
 		}
 		if (runs && !fake) {
@@ -356,7 +358,7 @@ timercb(struct eventtimer *et, void *arg
 		next = &nexttick;
 	if (periodic) {
 		now = *next;	/* Ex-next tick time becomes present time. */
-		bintime_add(next, &timerperiod); /* Next tick in 1 period. */
+		bintime_addx(next, timerperiod.frac); /* Next tick in 1 period. */
 	} else {
 		binuptime(&now);	/* Get present time from hardware. */
 		next->sec = -1;		/* Next tick is not scheduled yet. */
@@ -433,7 +435,7 @@ loadtimer(struct bintime *now, int start
 			new.sec = 0;
 			new.frac = timerperiod.frac - tmp;
 			if (new.frac < tmp)	/* Left less then passed. */
-				bintime_add(&new, &timerperiod);
+				bintime_addx(&new, timerperiod.frac);
 			CTR5(KTR_SPARE2, "load p at %d:   now %d.%08x first in %d.%08x",
 			    curcpu, now->sec, (unsigned int)(now->frac >> 32),
 			    new.sec, (unsigned int)(new.frac >> 32));
@@ -531,7 +533,7 @@ configtimer(int start)
 	if (start) {
 		/* Initialize time machine parameters. */
 		next = now;
-		bintime_add(&next, &timerperiod);
+		bintime_addx(&next, timerperiod.frac);
 		if (periodic)
 			nexttick = next;
 		else



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