From bcdda30bae1fef67d998211c54c06270ba42864c Mon Sep 17 00:00:00 2001 From: "Andrew J. Schorr" Date: Sun, 29 Apr 2007 15:48:22 +0000 Subject: [logging] Minor performance tweak 2007-04-29 Andrew J. Schorr * log.c: (quagga_timestamp) Optimize the subsecond timestamp generation. --- lib/ChangeLog | 4 ++++ lib/log.c | 25 ++++++++++++++++--------- 2 files changed, 20 insertions(+), 9 deletions(-) diff --git a/lib/ChangeLog b/lib/ChangeLog index 3e515f87..f8fdd11e 100644 --- a/lib/ChangeLog +++ b/lib/ChangeLog @@ -1,3 +1,7 @@ +2007-04-29 Andrew J. Schorr + + * log.c: (quagga_timestamp) Optimize the subsecond timestamp generation. + 2007-04-28 Andrew J. Schorr * command.c: (config_write_host) Save "log timestamp precision" diff --git a/lib/log.c b/lib/log.c index 76682227..21bf3f2f 100644 --- a/lib/log.c +++ b/lib/log.c @@ -100,18 +100,25 @@ quagga_timestamp(int timestamp_precision, char *buf, size_t buflen) (buflen > cache.len+1+timestamp_precision)) { /* should we worry about locale issues? */ - long divisor = 100000; - char *p = buf+cache.len; - *p++ = '.'; + static const int divisor[] = {0, 100000, 10000, 1000, 100, 10, 1}; + int prec; + char *p = buf+cache.len+1+(prec = timestamp_precision); + *p-- = '\0'; + while (prec > 6) + /* this is unlikely to happen, but protect anyway */ + { + *p-- = '0'; + prec--; + } + clock.tv_usec /= divisor[prec]; do { - *p++ = '0'+(clock.tv_usec/divisor); - clock.tv_usec %= divisor; - divisor /= 10; + *p-- = '0'+(clock.tv_usec % 10); + clock.tv_usec /= 10; } - while (--timestamp_precision > 0); - *p = '\0'; - return p-buf; + while (--prec > 0); + *p = '.'; + return cache.len+1+timestamp_precision; } buf[cache.len] = '\0'; return cache.len; -- cgit v1.2.1