0,0 → 1,106 |
/* |
* 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); |
} |
|
|
|
|