This is Timer.m in view mode; [Download] [Up]
#import "Timer.h" @implementation Timer -tare { struct timezone tzone1; struct timeval realtime1; struct timeval realtime2; if(!noPS) NXPing(); gettimeofday(&realtime1,&tzone1); if(!noPS) NXPing(); gettimeofday(&realtime2,&tzone1); tare = (-realtime1.tv_sec + realtime2.tv_sec) + (-realtime1.tv_usec+ realtime2.tv_usec)/1.0E6; cumWallTime=0; return self; } -wallEnter { if(!noPS) NXPing(); gettimeofday(&realtime,&tzone); synctime = realtime.tv_sec +realtime.tv_usec/1.0E6; return self; } -wallLeave { double eTime; if(!noPS) NXPing(); gettimeofday(&realtime,&tzone); eTime = (-synctime + realtime.tv_sec + realtime.tv_usec /1.0E6) - tare; cumWallTime += eTime; return self; } -psEnter { if(!noPS) PSusertime(&stime); getrusage(RUSAGE_SELF,&rtime); pssynctime = (rtime.ru_utime.tv_sec + rtime.ru_stime.tv_sec) + (rtime.ru_utime.tv_usec + rtime.ru_stime.tv_usec) /1.0E6; return self; } -psLeave { int et; double appTime; double psTime; getrusage(RUSAGE_SELF,&rtime); appTime = ((rtime.ru_utime.tv_sec + rtime.ru_stime.tv_sec) + (rtime.ru_utime.tv_usec + rtime.ru_stime.tv_usec) /1.0E6) -pssynctime; cumAppTime += appTime; if(!noPS) PSusertime(&et); psTime = ((et-stime)/1000.0); cumPSTime += psTime; return self; } - startTimer { running = 1; [self tare]; [self wallEnter]; if(!noPS) [self psEnter]; return self; } - stopTimer { if(running){ [self wallLeave]; [self psLeave]; running = 0; } return self; } - (double) wallTime { return cumWallTime; } - (double) appTime { return cumAppTime; } - (double) psTime { return cumPSTime; } - (const char *)timeString { static char buf[256]; sprintf(buf,"TIMES: \t%5.1f (wall) \t%5.1f (sys) \t%5.1f (win)", [self wallTime],[self appTime],[self psTime]); return buf; } - setNoPS:(BOOL)flag { noPS = flag; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.