算法效率 - 如果需要更多比较,部分展开循环是否有效?

Kaw*_*iKx 1 algorithm fibonacci micro-optimization

如何判断在迭代中放入两个额外的赋值是否昂贵,或者设置if条件来测试另一个东西?在这里我详细说明.问题是生成并打印Fibonacci序列的前n个项,其中n> = 1.我在C中的工具是:

#include<stdio.h>
void main()
{
    int x=0,y=1,output=0,l,n;
    printf("Enter the number of terms you need of Fibonacci Sequence ? ");
    scanf("%d",&n);
    printf("\n");
    for (l=1;l<=n;l++)
    {
        output=output+x;
        x=y;
        y=output;
        printf("%d ",output);
    }
}
Run Code Online (Sandbox Code Playgroud)

但是"如何通过计算机解决它"这本书的作者说这是低效的,因为它对生成的单个斐波纳契数使用了两个额外的赋值.他建议:

a=0
b=1
loop: 
print a,b
a=a+b
b=a+b
Run Code Online (Sandbox Code Playgroud)

我同意这更有效,因为它始终保持a和b相关,并且一个赋值生成一个数字.但它一次打印或提供两个斐波那契数字.假设问题是生成奇数个术语,我们会做什么?作者建议设置一个测试条件来检查n是否为奇数.通过在每次迭代中添加if测试,我们不会失去减少分配数量的收益吗?

Jef*_*Sax 5

我认为作者的建议非常糟糕,甚至在一本针对初学程序员的书中提出这一建议.(编辑:平心而论,这本书最初发表于1982年,当时编程通常比现在低得多.)

99.9%的代码不需要优化.特别是在这样的代码中,将非常便宜的操作(整数运算)与非常昂贵的操作(I/O)混合在一起,优化廉价部件完全浪费时间.

像这样的微优化只有在需要从硬件中挤出每一点性能时才应考虑时间关键代码.

当您确实需要它时,了解几个选项中哪个选项最佳的唯一方法是测量.即便如此,结果可能会因不同的处理器,平台,内存配置而发生变化......