void timingtest()

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;
}