首页 > 解决方案 > 为什么时间会变?

问题描述

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

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

标签: ctime

解决方案


您尝试测量的计算速度太快,无法以这种方式获得任何有意义的时序测量。

试试这个:

#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()函数的大量开销的结果。

要对排序函数的性能进行有意义的测量,可以对更大的列表进行排序,或者在循环中多次重复排序,以便获得足够长的时间进行测量。

要回答时间为什么会改变的问题,我认为答案只是随机改变了一点,再运行几次,你可能会再次得到另一个值。


推荐阅读