in benchmarks/benchmark.c [96:155]
void timingtest(int enabled,char *name,void (*f)(void))
{ uint64_t t, i, d;
double mean, variance, stddev, opsec, tt, dd;
double timing[CORE_REPS];
double covariance, dvariance, dstddev;
clock_t start_time, finish_time, time_diff;
if (!enabled)
{ printf("%-32s: *** NOT APPLICABLE ***\n",name);
return;
}
// One more little warmup
(*f)();
// Main timing loop, recording runtimes in nanoseconds in timing[i]
for (i = 0; i < CORE_REPS; ++i)
{ d = i % 65;
random_bignumd(BUFFERSIZE,b0,d);
random_bignumd(BUFFERSIZE,b1,d);
random_bignumd(BUFFERSIZE,b2,d);
random_bignumd(BUFFERSIZE,b3,d);
start_time = clock();
(*f)();
finish_time = clock();
time_diff = finish_time - start_time;
timing[i] = (1e9 * (double) time_diff) / ((double) INNER_REPS * (double) CLOCKS_PER_SEC);
}
// Compute the statistics
mean = 0.0;
for (i = 0; i < CORE_REPS; ++i) mean += timing[i];
mean = mean / CORE_REPF;
variance = covariance = dvariance = 0.0;
for (i = 0; i < CORE_REPS; ++i)
{ tt = timing[i] - mean;
dd = (double) (i % 65) - 32.5;
variance += tt * tt;
dvariance += dd * dd;
covariance += tt * dd;
}
variance = variance / CORE_REPF;
covariance = covariance / CORE_REPF;;
dvariance = dvariance / CORE_REPF;;
stddev = sqrt(variance);
dstddev = sqrt(dvariance);
opsec = 1e9 / mean;
printf("%-32s: %7.1f ns each (var %4.1f%%, corr %5.2f) = %10.0f ops/sec\n",
name,mean,100.0*stddev/mean,covariance / (stddev * dstddev),opsec);
arithmean += mean;
geomean += log(mean);
++tests;
}