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 );
那么我该怎么做来衡量时间呢?
两件事情:
-
10000
在现代计算机上并不是很多。 因此,该循环的运行时间可能不到一毫秒 – 小于clock()
的精度。 因此它将返回零。 -
如果您没有使用
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的高分辨率计时器?