这就是我所做的。首先,我们有简单的插入排序代码。我决定时间了。代码是这样的:
#include<stdio.h>
#include<time.h>
int insertion_sort(int arr[], int len){
int i;
int key;
for(i = 1; i < len; i++){
key = arr[i];
int j = i - 1;
while(arr[j] >= key && j >= 0){
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
int main(){
int arr[5] = {3, 2, 5, 1, 4};
clock_t beg = clock();
insertion_sort(arr, 5);
clock_t end = clock();
int i;
for(i = 0; i < 5; i++)
{
printf("%d\n", arr[i]);
}
double deltaT = (double)(end - beg)/CLOCKS_PER_SEC;
printf("Time take is: %lf seconds\n", deltaT);
}
因此,接下来我编译并运行我的代码。输出为:
1
2
3
4
5
Time take is: 0.000002 seconds
然后我决定秒计时器太小,我们需要改用毫秒。因此,我将计算结果乘以千,例如:
deltaT = (end - beg) * 1000 / CLOCKS_PER_SEC
,然后更改相关的printf。 时间读数仍保持2μs不变。当我重新删除1000并将代码还原回旧格式时,真正的魔术发生了。
这一次时间奇迹般地改变为相当慢的3μs。发生这种突然变化的原因是什么?我们希望我们的机器在相同的输入下能工作相同,但是为什么在尝试相同的输入时性能会有所不同?
答案 0 :(得分:1)
您尝试测量的计算速度太快,以至于无法以这种方式获得任何有意义的时序测量结果。
尝试一下:
#include<stdio.h>
#include<time.h>
int main(){
clock_t beg = clock();
clock_t end = clock();
double deltaT = (double)(end - beg)/CLOCKS_PER_SEC;
printf("Time take is: %lf seconds\n", deltaT);
}
然后,即使在两个clock()
调用之间完全不执行任何操作,您也可能会发现获得类似的“耗时”输出。您所看到的只是调用clock()
函数的大量开销的结果。
要获得有意义的排序功能性能度量,请对更大的列表进行排序,或者在循环中多次重复排序,以使您有足够的时间进行度量。
要回答有关时间为何更改的问题,我认为答案只是随机改变一点,再运行几次,您可能会再次获得另一个值。
答案 1 :(得分:0)
当您尝试以时钟滴答为单位测量时间时,请三思。答案是取决于架构的整数个时钟滴答。这意味着有时候您会得到一个时钟滴答声(转换为微秒可能意味着某件事),有时会得到两个时钟滴答声(将原始时间加倍)。
最好使用clock_gettime(2)
或gettimeofday(2)
(前者具有纳秒级的分辨率,而精确度可以更低,而后者具有微秒级的分辨率)在任何情况下,您都没有1.0E6
或{{每秒1}}次抽动。