C++ 一个循环比几个循环好吗?

C++ 一个循环比几个循环好吗?,c++,performance,C++,Performance,我一直在研究BigInteger的实现,当我考虑加法的解决方案时,我决定使用cleaner one,它考虑在函数中添加相应的数字,并在以后“规范化”它们。就像下面的例子一样 999 999+111 111 =10(添加后的值) =111110(标准化后的值) 但从那时起,我就想知道它是如何影响项目的效率的。多个循环做的小事情是否都比一个嵌套的大循环快? 例如,使用 int a[7]={0,9,9,9,9,9,9}; int b[7]={0,1,1,1,1,1,1}; int c[7]; 这是,

我一直在研究BigInteger的实现,当我考虑加法的解决方案时,我决定使用cleaner one,它考虑在函数中添加相应的数字,并在以后“规范化”它们。就像下面的例子一样

999 999+111 111
=10(添加后的值)
=111110(标准化后的值)

但从那时起,我就想知道它是如何影响项目的效率的。多个循环做的小事情是否都比一个嵌套的大循环快?
例如,使用

int a[7]={0,9,9,9,9,9,9};
int b[7]={0,1,1,1,1,1,1};
int c[7];
这是,

for(int q=0; q<7; ++q){
    c[q]=a[q]+b[q];
    if(c[q]>9){
        c[q-1]=c[q]/10;
        c[q]%=10;
    }
}
for(int q=0;q9){
c[q-1]=c[q]/10;
c[q]=10;
}
}
比这更好

for(int q=0; q<7; ++q){
    c[q]=a[q]+b[q];
}
for(int q=0;q<7;++q){
    if(c[q]>9){
        c[q-1]=c[q]/10;
        c[q]%=10;
    }
}

<代码> >(int q=0;q)很难判断这两种方法中哪一种会更有效。它可能在C++编译器供应商和单个供应商之间,从编译器的版本到版本不同。

底线是:

  • 除非你做基准测试,否则你永远不会知道

  • 像往常一样,几乎可以肯定的是,不管怎样,这都无关紧要,而且您很可能过度关注性能,就像绝大多数程序员在绝大多数情况下所做的那样

  • 归根结底,最重要的是什么更具可读性和可维护性。代码可维护性比节省时钟周期重要得多

  • 如果你决定走“什么更具可读性”的明智之路请记住,不同的人会发现不同的东西更具可读性。例如,我个人不喜欢阅读代码时的惊喜,因此我会很恼火地阅读您的第一个循环,该循环允许十进制数字接收0-9范围之外的错误值,但后来发现您最终通过另一个循环来纠正这一点


  • 正常化后,缓存一致性会更好,因为您只需访问每个元素一次。只需在每个单元格的总和中包含一个进位(初始化为0)。也就是说,有关性能的问题应该总是说“同时尝试/all和profile”看看编译器生成的汇编语言。接下来,profile.Abracadabra!…呜呜。我的黑魔盒不知道答案。旁白:你测量了吗?你的编译器生成了什么汇编?启用了优化?我们无法告诉你哪个“更快”Mike Mike:如果性能是一个重要的目标,那么考虑通过使用比10更大的基数来减少迭代次数。如果小数转换频繁的话,十的大功率将工作,尽管自然二进制会加快速度。