C如何正确测量时间?

这是“算法”,但是当我想测量执行时间时,它给我零。 为什么?

#define ARRAY_SIZE 10000 ... clock_t start, end; start = clock(); for( i = 0; i < ARRAY_SIZE; i++) { non_parallel[i] = vec[i] * vec[i]; } end = clock(); printf( "Number of seconds: %f\n", (end-start)/(double)CLOCKS_PER_SEC ); 

那么我该怎么做来衡量时间呢?

两件事情:

  1. 10000在现代计算机上并不是很多。 因此,该循环的运行时间可能不到一毫秒 – 小于clock()的精度。 因此它将返回零。

  2. 如果您没有使用non_parallel的结果, non_parallel编译器可能会优化整个循环。

最有可能的是,你只需要一个更昂贵的循环。 尝试将ARRAY_SIZE增加到更大的值。


这是我的机器上有一个更大arrays尺寸的测试:

 #define ARRAY_SIZE 100000000 int main(){ clock_t start, end; double *non_parallel = (double*)malloc(ARRAY_SIZE * sizeof(double)); double *vec = (double*)malloc(ARRAY_SIZE * sizeof(double)); start = clock(); for(int i = 0; i < ARRAY_SIZE; i++) { non_parallel[i] = vec[i] * vec[i]; } end = clock(); printf( "Number of seconds: %f\n", (end-start)/(double)CLOCKS_PER_SEC ); free(non_parallel); free(vec); return 0; } 

输出:

 Number of seconds: 0.446000 

这是实际计时秒数的一种不可靠的方法,因为clock()函数的精度非常低,并且你的循环没有做很多工作。 您可以使循环执行更多操作以使其运行更长时间,或使用更好的计时方法。

更高精度的方法是特定于平台的。 对于Windows,请参阅如何使用QueryPerformanceCounter? 对于Linux,请参阅使用C ++和Linux的高分辨率计时器?