#include #include #include "timer.h" #define SEC_TO_US 1000000 void timer_init(Timer *t) { t->start_rusage = (struct rusage*)malloc(sizeof(struct rusage)); t->end_rusage = (struct rusage*)malloc(sizeof(struct rusage)); t->result_rusage = (struct rusage*)malloc(sizeof(struct rusage)); } void timer_start(Timer* t) { getrusage(RUSAGE_SELF, t->start_rusage); } void timer_end(Timer* t) { getrusage(RUSAGE_SELF, t->end_rusage); // Calculate the result if (t->result_rusage == NULL) { t->result_rusage = (struct rusage*)malloc(sizeof(struct rusage)); } diff_timeval(&(t->end_rusage->ru_utime), &t->start_rusage->ru_utime, &t->result_rusage->ru_utime); diff_timeval(&t->end_rusage->ru_stime, &t->start_rusage->ru_stime, &t->result_rusage->ru_stime); } void diff_timeval(struct timeval* t1, struct timeval* t2, struct timeval* dst) { dst->tv_sec = t1->tv_sec - t2->tv_sec; if (t1->tv_usec < t2->tv_usec) { // Do a carry-ish operation dst->tv_sec--; dst->tv_usec = (t1->tv_usec + SEC_TO_US) - t2->tv_usec; } else dst->tv_usec = t1->tv_usec - t2->tv_usec; } void display_statistics(Timer* t) { if (t->result_rusage == NULL) { printf("No statistics captured.\n"); return; } printf("User time used: %lfs\n", (t->result_rusage->ru_utime.tv_sec + ((double)t->result_rusage->ru_utime.tv_usec / SEC_TO_US))); printf("Sys time used: %lfs\n", (t->result_rusage->ru_stime.tv_sec + ((double)t->result_rusage->ru_stime.tv_usec / SEC_TO_US))); }