#include #include #if defined(SysV) || defined(__svr4__) #include #include #include #else #include #endif #include "timing.h" static double last_cpustamp = 0.0; static double last_timestamp = 0.0; static int basetime; void io_error(char *reason) { fprintf(stderr,"Fehler bei %s\n",reason); exit(1); } void timestamp() { last_timestamp = time_so_far(); last_cpustamp = cpu_so_far(); } double cpu_so_far() { #if defined(SysV) || defined(__svr4__) struct tms tms; if (times(&tms) == -1) io_error("times"); return ((double) tms.tms_utime) / ((double) CLK_TCK) + ((double) tms.tms_stime) / ((double) CLK_TCK); #else struct rusage rusage; getrusage(RUSAGE_SELF, &rusage); return ((double) rusage.ru_utime.tv_sec) + (((double) rusage.ru_utime.tv_usec) / 1000000.0) + ((double) rusage.ru_stime.tv_sec) + (((double) rusage.ru_stime.tv_usec) / 1000000.0); #endif } double time_so_far() { #if defined(SysV) || defined(__svr4__) int val; struct tms tms; if ((val = times(&tms)) == -1) io_error("times"); return ((double) val) / ((double) CLK_TCK); #else struct timeval tp; if (gettimeofday(&tp, (struct timezone *) NULL) == -1) io_error("gettimeofday"); return ((double) (tp.tv_sec - basetime)) + (((double) tp.tv_usec) / 1000000.0); #endif } void zeitausgabe(char *was, FILE *ts) { /* fprintf(ts,"Zeit fuer %s: %10.3f sec\n",was,cpu_so_far()-last_cpustamp); */ FILE *file; if (ts==0) file=stderr; else file=ts; fprintf(file,"%.2f s (%.1f%%)" ,cpu_so_far()-last_cpustamp ,(cpu_so_far()-last_cpustamp)/(time_so_far()-last_timestamp)*100.0 ); if (was) fprintf(file,": `%s'\n",was); else fprintf(file,"\n"); } void zeitausgabe_stderr() { /* fprintf(ts,"Zeit fuer %s: %10.3f sec\n",was,cpu_so_far()-last_cpustamp); */ zeitausgabe(0,stderr); } void zeitausgabe_stdout() { zeitausgabe(0,stdout); }