【问题标题】:C - series of if statements vs else if time measuringC - 一系列 if 语句与 else if 时间测量
【发布时间】:2018-04-25 07:30:31
【问题描述】:

如果缺少我的术语,我很抱歉。 我编写了一个代码来演示一系列 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);

then 相同,但 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 系列花费相同的时间 bc 它必须检查每个条件,即使第一个条件已经为真 - 但它需要一半的时间 当我给它的数组只有 5s 时,它也更快。

谁能解释一下如何更快? - 谢谢:/(当我给它运行值从 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

【问题讨论】:

  • 你对 arr[0] 有什么看法?
  • 借助现代编译器优化,您效率低下的 if 结构很可能会被重写
  • 直接简化程序,并检查生成的程序集。这可能会让你大吃一惊。您的测试也缺乏统计严谨性。
  • 很难说不知道您系统的所有细节。但我会考虑分支预测是否在这里起作用。

标签: c performance if-statement time


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 哦,谢谢!我是一个完整的初学者,不知道分支预测器是什么,再次感谢,伙计。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-16
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多