2017-03-05 57 views
1

如果我們有,如果有這樣的變量聲明聲明:爲什麼if語句和變量聲明比循環中的加法更快?

#include <iostream> 
#include <ctime> 

using namespace std; 

int main() { 

    int res = 0; 

    clock_t begin = clock(); 
    for(int i=0; i<500500000; i++) { 
     if(i%2 == 0) {int fooa; fooa = i;} 
     if(i%2 == 0) {int foob; foob = i;} 
     if(i%2 == 0) {int fooc; fooc = i;} 
    } 
    clock_t end = clock(); 
    double elapsed_secs = double(end - begin)/CLOCKS_PER_SEC; 

    cout << elapsed_secs << endl; 

    return 0; 
} 

結果是:

1.44 

Process returned 0 (0x0) execution time : 1.463 s 
Press any key to continue. 

但是,如果它是:

#include <iostream> 
#include <ctime> 

using namespace std; 

int main() { 

    int res = 0; 

    clock_t begin = clock(); 
    for(int i=0; i<500500000; i++) { 
     res++; 
     res--; 
     res++; 
    } 
    clock_t end = clock(); 
    double elapsed_secs = double(end - begin)/CLOCKS_PER_SEC; 

    cout << elapsed_secs << endl; 

    return 0; 
} 

結果是:

3.098 

Process returned 0 (0x0) execution time : 3.115 s 
Press any key to continue. 

爲什麼添加或減去運算比使用變量聲明的if語句花費更多時間?

+5

因爲具有變量聲明的if語句幾乎沒有任何內容,因此它不存在。 E:儘管我現在看到它,但是這些循環都沒有做任何事情,所以爲了獲得任何時間,你必須在優化被抑制的情況下進行編譯。這使得結果毫無意義,但這也意味着我的初步猜測不適用。 – harold

+2

檢查您的彙編代碼以查看優化的效果。 – MikeCAT

+0

[這裏是一個例子,說明如何在C中使用前後的遞增器](https://www.quora.com/How-do-the-increment-and-decrement-operators-work-in-C) – user82395214

回答

0

差異幾乎肯定是由於編譯器優化。您必須查看程序集以確保它正常運行,但是這裏是我看看會發生什麼事情:

在第一個示例中,優化程序認識到if的主體沒有任何作用是微不足道的。在if的局部變量中,每個變量都被聲明,分配並立即銷燬。因此,if可以得到優化,留下一個空的for循環,也可以進行優化。

第二個例子中的思維並不總是那麼微不足道。什麼微不足道的是,循環的主體歸結爲一個單一的res++,這很可能會進一步優化到++res。但是因爲res不是循環的本地優化器必須考慮整個main()函數來實現循環沒有效果。很可能它沒有這樣做。

結論:在目前的形式下,測量毫無意義。禁用優化也無濟於事,因爲你永遠不會爲生產版本做這件事。如果你真的想深入研究這個問題,我建議你看看CppCon 2015: Chandler Carruth "Tuning C++: Benchmarks, and CPUs, and Compilers! Oh My!"以獲得關於如何在這些類型的siutuations中處理優化器的很好的建議。