2015-09-28 58 views
0

我有以下代碼:當-O3設置到底發生了

int main() 
{ 
int i=0; 
for(i=0;i<10000000;i++) 
     //do something 
return 0; 
} 

當我運行使用此代碼「GCC -o文件file.c」命令,它是越來越在244毫秒的執行和當我使用'gcc -O3 file.c -o file'執行相同的代碼時,它會在0毫秒內執行(很少顯示爲零的時間)。我無法理解-O3標記所做的優化是如何在執行過程中獲得大量速度的。

關於'-O3'優化的任何鏈接,文檔或解釋(除了gcc.gnu.org,我已經看到並發現這裏給出的信息不足以爲我提供一個體面的解釋和洞察什麼)非常感謝。

+2

也許它意識到沒有使用循環的副作用並代之以nop – amdixon

+1

如果您想了解發生了什麼問題,請爲我們提供由gcc生成的彙編代碼。現在我們可以猜測。另外我認爲,在這種情況下,「做某件事」具有意義。 – DawidPi

+5

這取決於很多*做什麼*做! –

回答

1

最終我們需要知道什麼 //do something呢。你應該粘貼你使用的確切代碼,因爲從技術上講,return語句將作爲循環的主體執行。

如果你有這樣的事情:

int main() 
{ 
    int i=0; 
    int junkInteger = 0; 
    for(i=0; i < 5 ;i++) 
    { 
     junkInteger++; // just to have a body 
    } 
    return 0; 
} 

有了優化,你的循環可能會成爲像展開等,因此會導致你的代碼尺寸變得更大。

int main() 
{ 
    int i=0; 
    int junkInteger = 0; 

    // loop gets unrolled 
    junkInteger++; 
    junkInteger++; 
    junkInteger++; 
    junkInteger++; 
    junkInteger++; 
    return 0; 
} 

當循環被展開,低級彙編/機器代碼沒有進行加載,存儲,比較和分公司管理循環。

你應該試一下再代碼:

int main() 
{ 
    int i=0; 
    for(i=0;i<10000000;i++) 
    { 
     //do something 
    } 
    return 0; 
} 

既優化編譯它開啓和關閉並檢查文件大小,甚至把在編譯選項生成彙編代碼。通常啓用優化後,由於循環展開,代碼大小可能會變大。儘管代碼可以被優化,因爲身體什麼都不做。也許使用一個易失性循環計數器來確保它沒有被優化。

相關問題