#include <sys/timeb.h>
double timer(char *name,double flop,
double (*func)(int,double **,double **,double **,
double *,double *,double *),
int n)
{
/* Timer variables */
struct _timeb time1,time2;
double ctime,mflop;
double **M1,*v1;
double **M2,*v2;
double **M3,*v3;
int i,j;
M1=dmatrix(0,n,0,n);
M2=dmatrix(0,n,0,n);
M3=dmatrix(0,n,0,n);
v1=dvector(0,n);
v2=dvector(0,n);
v3=dvector(0,n);
/* Fill in values for input vectors */
for (i=0; i<n; i++) {
v1[i]=3.14159;
v2[i]=0.314159;
}
/* Fill in values for input matrices */
for (i=0; i<n; i++)
for (j=0; j<n; j++) {
M1[i][j]=1./(1+i+j);
M2[i][j]=1./(2+i+j);
}
/* Record time of function call */
_ftime(&time1);
/* Call function */
func(n,M1,M2,M3,v1,v2,v3);
/* Record time of function return */
_ftime(&time2);
/* Compute time in seconds */
ctime = (time2.time-time1.time) /* Integer seconds */
+(time2.millitm-time1.millitm)/1.e3; /* Integer giving milliseconds part */
/* Convert from FLOP to MFLOP */
mflop=flop/1e6;
/* Output result */
fprintf(stderr,"%20s: %4.0lf MFLOPS = %.1lf MFLOP / %.3f sec\n",
name,mflop/ctime,mflop,ctime);
/* Free memory before return */
free_dvector(v1,0,n);
free_dvector(v2,0,n);
free_dvector(v3,0,n);
free_dmatrix(M1,0,n,0,n);
free_dmatrix(M2,0,n,0,n);
free_dmatrix(M3,0,n,0,n);
return ctime;
}