2013-10-30 95 views
15

我對海灣合作委員會-O3旗幟相當熟悉,但它與-Os有何不同,在哪種情況下我們應該比其他人更喜歡?海灣合作委員會:-O3和-Os之間的區別

+0

不是'-Os'優化大小和'-O1','-O2','-O3 '爲了速度? – fvdalcin

+1

'-Os'優化了可執行文件的大小。你可以看到哪些特定的標誌被打開[這裏](http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)。 – BoBTFish

+2

[「-Os:優化大小 - -Os啓用所有-O2優化,通常不會增加代碼大小,還會執行進一步的優化以減少代碼大小。」](http://gcc.gnu.org/onlinedocs /gcc/Optimize-Options.html)。將它用於嵌入式平臺,其中代碼大小可能比出血速度更重要(或者您甚至可能無法通過O3獲得更多速度,只是更大的代碼大小) –

回答

20

GCC documentation描述了這些選項非常明確地做了什麼。

-O3嘗試優化代碼以獲得更高性能。它包含了-O2包括的所有優化,還有一些更多。

-Os另一方面指示GCC「優化尺寸」。它啓用所有-O2優化,這些優化不會增加可執行文件的大小,然後它還會切換一些優化標誌以進一步減小可執行文件大小。

請注意,我一直故意對我的描述有些模糊 - 請閱讀GCC文檔以更深入地討論哪些標誌啓用了優化級別。

我相信-O *優化級別就是這樣 - 互斥,明顯級別的優化。混合它們並沒有意義,因爲兩個級別將啓用或者忽略另一個有意忽略或啓用(分別)的標誌。如果你想混合搭配(你可能實際上並不想這樣做,除非你有一個很好的理由要一組特定的標誌),你最好閱讀文檔並混合並匹配每個標誌的標誌手動啓用。

我想我還會鏈接來自Gentoo Linux Wiki的this article,它講述了與構建操作系統包有關的優化標誌。顯然不是所有的這是適用的,但它仍包含了一些有趣的信息 - 一個:

與-O3編譯的是不是一個保證的方式來提高性能,而事實上在很多情況下,由於系統變慢更大的二進制文件和更多的內存使用。 -O3也被稱爲打破幾個包。因此,不建議使用-O3。

根據那篇文章,-O2在大多數情況下「和-O3一樣好,並且對於可破壞的可執行輸出更安全。

2

這取決於。你需要優化速度或大小嗎?

-O3
最多的優化。 -O3打開由-O2指定的所有優化,並打開-finline-functions,-funswitch-loops, -fpredictive-commoning,-fgcse-after-reload,-ftree-loop-vectorize,-ftree-slp-矢量化,-fvect-cost-model,-ftree-partial-pre和-fipa-cp-clone選項。

-O0
減少編譯時間並使調試產生預期結果。這是默認設置。

-Os
優化尺寸。 -Os啓用通常不會增加代碼大小的所有-O2優化。它還執行進一步優化 旨在減少代碼大小。
-Os禁止以下優化標誌:

-falign-functions-falign-jumps-falign-loops-falign-labels -freorder-blocks-freorder-blocks-and-partition -fprefetch-loop-arrays

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

其實,-O是獨立優化的長列表的簡寫。如果您不知道自己需要什麼,只需撥打-O3

+0

如果可能的話,我會去兩者的組合,是嗎? – Saqlain

+0

我會建議-O2或-Os,但我仍然同意,如果一個人不知道他們需要什麼,什麼都可以。 – Vorac

+2

如果你使用單獨的標誌是。但是,如果你同時指定-Os -O3,第二個將重疊第一個... – opalenzuela

5

我建議閱讀GCC文檔。 -O3用於獲取快速運行的代碼(即使犧牲一些代碼膨脹),而-Os正在優化生成的代碼的大小。

有許多其他(不明顯的)GCC optimization flags(例如-fgcse-sm),其中許多未啓用,即使在-O3。您可能也會對-flto(對於鏈接時間優化)感興趣,並且例如, -O3-Os,均在編譯時和鏈接時間。然後請參閱this answer

最後,請注意使用最新版本的GCC(目前在2013年底爲4.8),因爲GCC正在大幅改進其優化。

您可能還想使用-mtune=native(至少適用於x86)。

而且你甚至可以編寫自己的優化通道,針對你自己特定的庫和API,也許使用MELT插件。

正如CmdrMoozy answered你可能更喜歡使用-O2超過-O3(但是請注意,最近版本的GCC改善了很多他們的-O3,所以的Gentoo引用-recommending對-O3和支持-O2變得不那麼重要。)。由於這個SlashDot-ed Stack paper(by Xi Wang,Nickolai Zeldovich,M. Frans Kaashoek和Armando Solar-Lezama)顯示,很多程序並不完全符合C標準,並且不快樂(並且行爲不正確)當一些有效優化完成。 Undefined behavior是一個棘手的問題。

順便說一句,請注意使用-O3通常使你的編譯時間要大得多,並且最常帶來的(但不總是)百分之幾比-O2甚至-O1更高的性能......(它與-flto更糟) 。這就是爲什麼很少使用它。

0

這不是真的可以回答,一個簡單的規則是使用優化在關鍵代碼路徑上的速度,並在非關鍵代碼路徑(如加載)上優化大小...

某些編譯器可以在兩個工作階段中爲您做出決定,第一個編譯器創建一個帶有配置文件支持的特殊可執行文件,運行應用程序以收集數據,第二個編譯器可以根據什麼數據是最好的。它允許去虛擬化,分支預測,...

1

-O3優化速度,而-Os優化空間。這意味着-O3會給你一個快速的可執行文件,但它可能相當大,而且-Os給你一個較小的可執行文件,但速度可能會更慢。

空間和時間效率通常是一種折衷。更快的算法傾向於佔用更多空間,原地算法(不增加空間使用率的算法)往往效率較低。

通常現代計算機有足夠的內存空間,所以-O3通常是首選。然而,如果你正在編寫一個低內存的東西(比如一個小設備),你可能會更喜歡-Os

相關問題