C - 系列的if语句vs else如果时间测量

时间:2018-04-25 07:30:31

标签: c performance if-statement time

如果我的术语不足,我很抱歉。 我编写了一个代码来证明一系列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
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的随机值数组时,如果更快约两次,则为其他值 但是(这里有混乱)当它给出一个数千的1的数组时我会期望if系列花费相同的时间bc它必须检查每个条件,即使第一个已经是真的 - 但它需要HALF时间 当我给它只有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

1 个答案:

答案 0 :(得分:0)

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

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

如果使用常量填充数组,则预测变量将为100%。

即。使用随机输入,计算的if的计数确实很重要,因为它们中的大量导致CPU流水线停滞。

使用常量输入,执行的if的数量或多或少可以忽略不计,并且没有管道停顿。重要的是一些CPU内部以及编译器能够优化代码的能力。智能编译器可能能够有效地将您的两个或两个示例中的一个替换为switch语句,因此,如果不查看生成的指令,我们可以推测。