Blame | Last modification | View Log | Download | RSS feed
/** ftimer.c - Estimate the time (in seconds) used by a function f** Copyright (c) 2002, R. Bryant and D. O'Hallaron, All rights reserved.* May not be used, modified, or copied without permission.** Function timers that estimate the running time (in seconds) of a function f.* ftimer_itimer: version that uses the interval timer* ftimer_gettod: version that uses gettimeofday*/#include <stdio.h>#include <sys/time.h>#include "ftimer.h"/* function prototypes */static void init_etime(void);static double get_etime(void);/** ftimer_itimer - Use the interval timer to estimate the running time* of f(argp). Return the average of n runs.*/double ftimer_itimer(ftimer_test_funct f, void *argp, int n){double start, tmeas;int i;init_etime();start = get_etime();for (i = 0; i < n; i++)f(argp);tmeas = get_etime() - start;return tmeas / n;}/** ftimer_gettod - Use gettimeofday to estimate the running time of* f(argp). Return the average of n runs.*/double ftimer_gettod(ftimer_test_funct f, void *argp, int n){int i;struct timeval stv, etv;double diff;gettimeofday(&stv, NULL);for (i = 0; i < n; i++)f(argp);gettimeofday(&etv,NULL);diff = 1E3*(etv.tv_sec - stv.tv_sec) + 1E-3*(etv.tv_usec-stv.tv_usec);diff /= n;return (1E-3*diff);}/** Routines for manipulating the Unix interval timer*//* The initial value of the interval timer */#define MAX_ETIME 86400/* static variables that hold the initial value of the interval timer */static struct itimerval first_u; /* user time */static struct itimerval first_r; /* real time */static struct itimerval first_p; /* prof time*//* init the timer */static void init_etime(void){first_u.it_interval.tv_sec = 0;first_u.it_interval.tv_usec = 0;first_u.it_value.tv_sec = MAX_ETIME;first_u.it_value.tv_usec = 0;setitimer(ITIMER_VIRTUAL, &first_u, NULL);first_r.it_interval.tv_sec = 0;first_r.it_interval.tv_usec = 0;first_r.it_value.tv_sec = MAX_ETIME;first_r.it_value.tv_usec = 0;setitimer(ITIMER_REAL, &first_r, NULL);first_p.it_interval.tv_sec = 0;first_p.it_interval.tv_usec = 0;first_p.it_value.tv_sec = MAX_ETIME;first_p.it_value.tv_usec = 0;setitimer(ITIMER_PROF, &first_p, NULL);}/* return elapsed real seconds since call to init_etime */static double get_etime(void) {struct itimerval v_curr;struct itimerval r_curr;struct itimerval p_curr;getitimer(ITIMER_VIRTUAL, &v_curr);getitimer(ITIMER_REAL,&r_curr);getitimer(ITIMER_PROF,&p_curr);return (double) ((first_p.it_value.tv_sec - r_curr.it_value.tv_sec) +(first_p.it_value.tv_usec - r_curr.it_value.tv_usec)*1e-6);}