在bmark程序中,执行时间计算如下:
例如,对于EC点乘法:
#define MIN_TIME 10.0
#define MIN_ITERS 20
start=clock();
do {
ecurve_mult();
iterations++;
elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
} while (elapsed<MIN_TIME || iterations<MIN_ITERS);
elapsed=1000.0*elapsed/iterations;
printf("ER - %8d iterations",iterations);
printf(" %8.2lf ms per iteration\n",elapsed);
问题是:为什么不简单地使用:
start=clock();
ecurve_mult();
elapsed=(clock()-start)/(double)CLOCKS_PER_SEC;
printf("%f\n",elapsed*1000.0);
换句话说,使用MIN_TIME和MIN_ITERS
的目的是什么注意:两个代码给出不同的输出。
答案 0 :(得分:0)
此代码多次运行ecurve_mult
函数以获得平均运行时间。
MIN_ITERS
指定运行该函数的最少次数,而MIN_TIME
指定最小累计运行时间。
因此,在这种情况下,该函数必须运行20次或总共10秒,以先发生者为准。
相反,第二个代码片段只运行一次代码。
顺便说一句,以下是无效的:printf(elapsed*1000.0);
应该是:
printf("%f\n",elapsed*1000.0);
答案 1 :(得分:0)
代码试图执行ecurv_mult()
足够的时间来弥补时间测量中缺乏精确性。所以循环确保它至少执行20次并持续至少10秒。
由于某些机器可能如此之快以至于执行20次并不足以获得准确的精确度,因此我们确保这些机器至少持续10秒,无论我们执行20次这么快的速度。
如果我们只做一次,由于时钟的分辨率太高(例如,当基准测试在500us运行时时钟给我们1ms),我们的性能测量不会非常准确。