为什么时间在改变?

时间:2019-04-17 12:58:13

标签: c time

这就是我所做的。首先,我们有简单的插入排序代码。我决定时间了。代码是这样的:

#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。发生这种突然变化的原因是什么?我们希望我们的机器在相同的输入下能工作相同,但是为什么在尝试相同的输入时性能会有所不同?

2 个答案:

答案 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}}次抽动。