簡體   English   中英

設置-O3時會發生什么

[英]What exactly happens when -O3 is set

我有以下代碼:

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

當我使用'gcc -o file file.c'命令運行此代碼時,它在244毫秒內被執行,而當我使用'gcc -O3 file.c -o file'執行相同的代碼時,它在0被執行。毫秒(很少的時間顯示為零)。 我無法理解-O3標志以何種方式進行了優化,以至於我們獲得了很大的執行速度。

關於'-O3'優化的任何鏈接,文檔或解釋(除了gcc.gnu.org,我已經看到並發現給出的信息不足以為我提供像樣的解釋和對發生的事情的深刻理解)很多贊賞。

最終,我們需要知道//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;
}

在打開和關閉優化的情況下對其進行編譯,並檢查文件大小,甚至將其置於compile選項中以生成匯編代碼。 通常,啟用優化后,由於循環展開,代碼大小可能會變大。 盡管由於主體什么都不做,所以可以優化代碼。 也許使用易失性循環計數器以確保未對其進行優化。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM