2017-04-02 83 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範圍之外的錯誤值的循環,以後才發現你最終正在補救那與另一個循環。