2017-04-02 52 views
0

我一直在致力于BigInteger的实现,当我考虑添加解决方案时,我决定采用更清晰的解决方案,它考虑在函数中添加相应的数字,并在稍后“正常化”它们。像在下面的例子中比其中几个更好吗?

999 999 + 111 111
= 10 10 10 10 10 10(值加法之后)
= 1 111 110(归一化后的值)

但此后我想知道它是如何影响程序的效率的。几个循环做的小事通常都会比一个大的嵌套循环更快地工作?
例如,使用

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; 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; 
    } 
} 

更好,怎么样大循环,有更多的事情要在每次迭代经历?

UPD。
正如有人建议我测量两个例子的性能时间。对于两个循环,平均时间(对于100mil。元素)〜4.85sec。对于一个循环〜3.72秒

+1

当你走的时候进行标准化,对于缓存一致性会更好,因为你只需要访问每个元素一次。只需在每个单元的总和中包含一个进位(初始化为0)。也就是说,关于性能的问题应该总是说“试试/ all和profile”_ –

+2

看看编译器生成的汇编语言。接下来,**个人资料**。 –

+2

[Race Your Horses](https://ericlippert.com/2012/12/17/performance-rant/) – Filburt

回答

0

很难判断这两种方法中的哪一种更有效。它可能在C++编译器供应商和单个供应商中不同,从编译器的版本到版本。

的底线是:

  1. 你永远不会知道,除非你的标杆。

  2. 像往常一样,无论如何几乎可以肯定它并不重要,并且绝大多数情况下,您绝大多数程序员都会担心性能。

  3. 在一天结束时,所有重要的是更可读和更易于维护。代码可维护性是比保存时钟周期更重要。

  4. 如果你决定遵循“更可读性”的明智之道,请记住,不同的人发现不同的东西更具可读性。例如,当我正在阅读代码时,我个人会讨厌惊喜,所以我会非常恼火地读第一个允许十进制数字接收0-9范围之外的错误值的循环,以后才发现你最终正在补救那与另一个循环。