gpt4 book ai didi

C -一系列 if 语句与 else if 时间测量

转载 作者:行者123 更新时间:2023-11-30 20:31:36 25 4
gpt4 key购买 nike

如果我的术语缺乏,我事先表示歉意。我编写了一段代码来演示一系列 if 语句与 else/if 语句的低效率。结果对我来说没有任何意义。

这是一个简单的算法,它遍历一个数组(100000000 个元素)并计算元素的出现次数,即 1、2、3、4、5 或其他。

clock_t time1;
time1 = clock();
for (int i=1; i<=n; i++)
{
if (arr[i]==1)
p1++;
if (arr[i]==2)
p2++;
if (arr[i]==3)
p3++;
if (arr[i]==4)
p4++;
if (arr[i]==5)
p5++;
if (!(arr[i]>=1 && arr[i]<=5))
j++;
}
time1 = clock() - time1;

printf("count of 1s:\t %d\n",p1);
printf("count of 2s:\t %d\n",p2);
printf("count of 3s:\t %d\n",p3);
printf("count of 4s:\t %d\n",p4);
printf("count of 5s:\t %d\n",p5);
printf("count of errors:\t %d\n",j);
printf("\n --- counting took: %.10f ms---\n",((double)(time1)/CLOCKS_PER_SEC)*1000);

然后相同,但使用 else if

clock_t time2;
time2 = clock();
for (int i=1; i<=n; i++)
{
if (arr[i]==1)
p1++;
else if (arr[i]==2)
p2++;
else if (arr[i]==3)
p3++;
else if (arr[i]==4)
p4++;
else if (arr[i]==5)
p5++;
else j++;
}
time2 = clock() - time2;

正如预期的那样,当给定一个从 1 到 5 的随机值数组时,else if 的速度大约是原来的两倍但是(这里出现了困惑)当它给出了一千个 1 的数组时,我希望 if 系列花费相同的时间,因为它必须检查每个条件,即使第一个条件已经为真 - 但它需要一半的时间当我给它的数组只有 5 秒时,它也更快。

谁能解释一下如何才能更快? - 谢谢:/(当我给它运行从 4 到 5 的值时,它实际上花费的时间与从 1 到 5 的值大约相同)

(here are the results of the whole thing [ignore the Czech please])

编辑

以下是图像中的时间:

Code 1 - random input: 2451 ms
Code 2 - random input: 2401 ms

Code 1 - all-one input: 932 ms
Code 2 - all-one input: 573 ms

Code 1 - all-five input: 923 ms
Code 2 - all-five input: 697 ms

最佳答案

现代 CPU 是非常复杂的野兽。

我猜你更多的是对 CPU 分支预测器进行基准测试,而不是其他任何东西:如果你用 1...5 范围内的随机数填充数组,那么当任何 if 被执行。

如果用常量填充数组,预测变量将 100% 正确。

即对于随机输入,评估的 if 的数量确实很重要,因为大量的 if 会导致 CPU 管道停顿。

在恒定输入的情况下,执行的 if 数量或多或少可以忽略不计,并且不会出现管道停顿。重要的是一些 CPU 内部结构以及编译器优化代码的能力。智能编译器也许能够有效地将两个或两个示例之一替换为 switch 语句,因此无需查看生成的指令,我们就可以推测。

关于C -一系列 if 语句与 else if 时间测量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50016445/

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