如果我的术语不足,我很抱歉。 我编写了一个代码来证明一系列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);
然后相同但是如果
则使用elseclock_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
答案 0 :(得分:0)
现代CPU是非常复杂的野兽。
我想你更多的是对CPU分支预测器进行基准测试,而不是其他任何事情:如果你用1 ... 5范围内的随机数填充数组,那么当任何if
时,分支预测器通常会猜错。被执行。
如果使用常量填充数组,则预测变量将为100%。
即。使用随机输入,计算的if
的计数确实很重要,因为它们中的大量导致CPU流水线停滞。
使用常量输入,执行的if
的数量或多或少可以忽略不计,并且没有管道停顿。重要的是一些CPU内部以及编译器能够优化代码的能力。智能编译器可能能够有效地将您的两个或两个示例中的一个替换为switch
语句,因此,如果不查看生成的指令,我们可以推测。