/* CPU & WALL time usage timer routine */ /* returns -1 (error), 0 (ok) */ #include <stdio.h> #include <unistd.h> #include <sys/times.h> #include <sys/time.h> int timer(int option) { static struct tms begin_cpu, end_cpu; static struct timeval begin_wall, end_wall; long clk_tick; switch (option) { case 0 : if (gettimeofday(&begin_wall, NULL) == -1) err_sys("gettimeofday"); if (times(&begin_cpu) == -1) err_sys("times"); return(0); case 1 : if (gettimeofday(&end_wall, NULL) == -1) err_sys("gettimeofday"); if (times(&end_cpu) == -1) err_sys("times"); if ((clk_tick = sysconf(_SC_CLK_TCK)) == -1) err_sys("sysconf"); fprintf(stderr, "wall time = %ld sec\n\n", end_wall.tv_sec - begin_wall.tv_sec); fprintf(stderr, "cpu time = %.2f sec\n", ((end_cpu.tms_utime + end_cpu.tms_stime) - (begin_cpu.tms_utime + begin_cpu.tms_stime)) / (double) clk_tick); fprintf(stderr, " user = \t %.2f sec\n", (end_cpu.tms_utime - begin_cpu.tms_utime) / (double) clk_tick); fprintf(stderr, " system = \t %.2f sec\n\n", (end_cpu.tms_stime - begin_cpu.tms_stime) / (double) clk_tick); fprintf(stderr, "cpu time = %.2f sec (children)\n", ((end_cpu.tms_cutime + end_cpu.tms_cstime) - (begin_cpu.tms_cutime + begin_cpu.tms_cstime)) / (double) clk_tick); fprintf(stderr, " user = \t %.2f sec\n", (end_cpu.tms_cutime - begin_cpu.tms_cutime) / (double) clk_tick); fprintf(stderr, " system = \t %.2f sec\n", (end_cpu.tms_cstime - begin_cpu.tms_cstime) / (double) clk_tick); return(0); default : fprintf(stderr, "timer: bad option (%d)\n", option); return(-1); } }