gpt4 book ai didi

c - 程序运行时间测量不一致

转载 作者:太空宇宙 更新时间:2023-11-04 03:11:47 27 4
gpt4 key购买 nike

我正在做简单的测试来测量我的程序的执行时间。所以我写了一个简单的程序,有 2 个循环,每个循环迭代 N 次和 2N 次。我预计第二个循环需要大约两倍的时间,但当 N=1000000 时结果相反。

我已经测试了好几次,在另一台机器上得到了相同的结果。为什么会这样?

我的代码

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>

long long sum;

int main(int argc, char **argv)
{
int i;
long elapsed;
struct timeval start, end;

i = atoi(argv[1]);
sum = 0;
gettimeofday(&start, NULL);
while (i--)
sum += i;
gettimeofday(&end, NULL);

elapsed = (end.tv_sec - start.tv_sec) * 1000000;
elapsed += (end.tv_usec - start.tv_usec);
printf("1st loop : %ld\n", elapsed);

i = 2 * atoi(argv[1]);
sum = 0;
gettimeofday(&start, NULL);
while (i--)
sum += i;
gettimeofday(&end, NULL);

elapsed= (end.tv_sec - start.tv_sec) * 1000000;
elapsed+= (end.tv_usec - start.tv_usec);
printf("2nd loop : %ld\n", elapsed);
return 0;
}

一些测试结果

[arch:test] $ ./a.out 10
1st loop : 0
2nd loop : 0
[arch:test] $ ./a.out 100
1st loop : 1
2nd loop : 1
[arch:test] $ ./a.out 1000
1st loop : 7
2nd loop : 14
[arch:test] $ ./a.out 10000
1st loop : 73
2nd loop : 146
[arch:test] $ ./a.out 100000
1st loop : 725
2nd loop : 1448
[arch:test] $ ./a.out 1000000
1st loop : 5369 <-- always greater than 2nd loop
2nd loop : 3536
[arch:test] $ ./a.out 10000000
1st loop : 20203
2nd loop : 34434
[arch:test] $ ./a.out 100000000
1st loop : 174058
2nd loop : 339812
[arch:test] $ ./a.out 1000000000
1st loop : 1709652
2nd loop : 3392287

测试环境gcc 8.2.1,编译选项 -O0在 ubuntu 或 arch linux 上的结果相同,但在带有 cygwin 的 Windows 10 上则不同

最佳答案

您可能刚刚遇到第 1 次或第 2 次重新安排,而运行第一个循环的一半首当其冲。 gettimeofday 应该使用实时时钟,所以花在上下文切换上的时间确实算在内。当您下一次运行 10 倍以上的迭代时,上下文切换的次数应该增加大约 10 倍,因此如果一半的人比另一半多进行一次上下文切换,平均而言不会产生太大的差异。

我无法很好地重现您的结果,但是如果我使用 time -v 运行可执行文件,那么会显示上下文切换次数,然后是第一个和第二个循环的时间当上下文切换次数为 2 次时(第 2 次上下文切换),它们是最接近的。

关于c - 程序运行时间测量不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55637002/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com