75% speedup for zdump on 64-bit Solaris sparc

Olson, Arthur David (NIH/NCI) [E] olsona at dc37a.nci.nih.gov
Mon Mar 6 18:07:30 UTC 2006


Here's another possibility for speeding up zdump: remember the "ats"
index used in the last call to localtime and, when appropriate, start
the search there. (If you do this, you don't want to simply do a binary
search since you might already have the correct answer).

				--ado

------- localtime.c -------
*** /tmp/geta15068	Mon Mar  6 11:09:53 2006
--- /tmp/getb15068	Mon Mar  6 11:09:53 2006
***************
*** 5,11 ****
  
  #ifndef lint
  #ifndef NOID
! static char	elsieid[] = "@(#)localtime.c	8.1";
  #endif /* !defined NOID */
  #endif /* !defined lint */
  
--- 5,11 ----
  
  #ifndef lint
  #ifndef NOID
! static char	elsieid[] = "@(#)localtime.c	8.2";
  #endif /* !defined NOID */
  #endif /* !defined lint */
  
***************
*** 1263,1272 ****
  				break;
  			}
  	} else {
! 		for (i = 1; i < sp->timecnt; ++i)
  			if (t < sp->ats[i])
  				break;
  		i = (int) sp->types[i - 1];
  	}
  	ttisp = &sp->ttis[i];
  	/*
--- 1263,1287 ----
  				break;
  			}
  	} else {
! 		/*
! 		** Since "guess" is just a guess and is validated before
use,
! 		** its staticness does not affect thread safeness.
! 		*/
! 		static int	guess;
! 
! 		i = guess;
! 		if (i < 1 || i >= sp->timecnt || t < sp->ats[i])
! 			i = 1;
! 		for ( ; i < sp->timecnt; ++i)
  			if (t < sp->ats[i])
  				break;
  		i = (int) sp->types[i - 1];
+ 		/*
+ 		** Heuristic alert:
+ 		** the "- 1" below caters to programs such as zdump that
do
+ 		** lots of calls straddling a particular transition
time.
+ 		*/
+ 		guess = i - 1;
  	}
  	ttisp = &sp->ttis[i];
  	/*




More information about the tz mailing list