c - 为什么时间会变?
问题描述
所以这就是我所做的。首先,我们有我的简单插入排序代码。我决定计时。这就是代码的样子:
#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。这种突然变化的原因是什么。我们希望我们的机器在相同的输入下工作相同,但是当我尝试相同的输入时,为什么性能会有所不同?
解决方案
您尝试测量的计算速度太快,无法以这种方式获得任何有意义的时序测量。
试试这个:
#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()
函数的大量开销的结果。
要对排序函数的性能进行有意义的测量,可以对更大的列表进行排序,或者在循环中多次重复排序,以便获得足够长的时间进行测量。
要回答时间为什么会改变的问题,我认为答案只是随机改变了一点,再运行几次,你可能会再次得到另一个值。
推荐阅读
- .htaccess - 使用 .htaccess 从 404 页面获取引荐来源网址
- oracle-apex - Oracle APEX 自动流程执行
- python-3.x - FailedPreconditionError: 资源 localhost/_AnonymousVar404/N10tensorflow3VarE 不存在
- c++ - 非类型参数的模板实例化
- javascript - SAPUI5 SmartTable 动态忽略列
- c# - 无法使用 while 循环之外的值
- java - 使用 Springboot / Hibernate / RabbitMQ 的大规模多线程编写器
- c - 源字符串长于目标数组的 strncpy 问题
- python - 当列包含`List`而不是`Tuple`时,熊猫比较运算符`==`无法按预期工作
- google-chrome - 带有 Chrome 的 MBP 上的蓝色闪烁条纹