【发布时间】: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