我對海灣合作委員會-O3旗幟相當熟悉,但它與-Os有何不同,在哪種情況下我們應該比其他人更喜歡?海灣合作委員會:-O3和-Os之間的區別
回答
GCC documentation描述了這些選項非常明確地做了什麼。
-O3嘗試優化代碼以獲得更高性能。它包含了-O2包括的所有優化,還有一些更多。
-Os另一方面指示GCC「優化尺寸」。它啓用所有-O2優化,這些優化不會增加可執行文件的大小,然後它還會切換一些優化標誌以進一步減小可執行文件大小。
請注意,我一直故意對我的描述有些模糊 - 請閱讀GCC文檔以更深入地討論哪些標誌啓用了優化級別。
我相信-O *優化級別就是這樣 - 互斥,明顯級別的優化。混合它們並沒有意義,因爲兩個級別將啓用或者忽略另一個有意忽略或啓用(分別)的標誌。如果你想混合搭配(你可能實際上並不想這樣做,除非你有一個很好的理由要一組特定的標誌),你最好閱讀文檔並混合並匹配每個標誌的標誌手動啓用。
我想我還會鏈接來自Gentoo Linux Wiki的this article,它講述了與構建操作系統包有關的優化標誌。顯然不是所有的這是適用的,但它仍包含了一些有趣的信息 - 一個:
與-O3編譯的是不是一個保證的方式來提高性能,而事實上在很多情況下,由於系統變慢更大的二進制文件和更多的內存使用。 -O3也被稱爲打破幾個包。因此,不建議使用-O3。
根據那篇文章,-O2在大多數情況下「和-O3一樣好,並且對於可破壞的可執行輸出更安全。
這取決於。你需要優化速度或大小嗎?
-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
其實,-O是獨立優化的長列表的簡寫。如果您不知道自己需要什麼,只需撥打-O3。
如果可能的話,我會去兩者的組合,是嗎? – Saqlain
我會建議-O2或-Os,但我仍然同意,如果一個人不知道他們需要什麼,什麼都可以。 – Vorac
如果你使用單獨的標誌是。但是,如果你同時指定-Os -O3,第二個將重疊第一個... – opalenzuela
我建議閱讀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
更糟) 。這就是爲什麼我很少使用它。
這不是真的可以回答,一個簡單的規則是使用優化在關鍵代碼路徑上的速度,並在非關鍵代碼路徑(如加載)上優化大小...
某些編譯器可以在兩個工作階段中爲您做出決定,第一個編譯器創建一個帶有配置文件支持的特殊可執行文件,運行應用程序以收集數據,第二個編譯器可以根據什麼數據是最好的。它允許去虛擬化,分支預測,...
-O3優化速度,而-Os優化空間。這意味着-O3會給你一個快速的可執行文件,但它可能相當大,而且-Os給你一個較小的可執行文件,但速度可能會更慢。
空間和時間效率通常是一種折衷。更快的算法傾向於佔用更多空間,原地算法(不增加空間使用率的算法)往往效率較低。
通常現代計算機有足夠的內存空間,所以-O3通常是首選。然而,如果你正在編寫一個低內存的東西(比如一個小設備),你可能會更喜歡-Os
- 1. 編譯與海灣合作委員會
- 2. 海灣合作委員會優化級別1的子選項
- 3. 海灣合作委員會無法識別`-I ../路徑`
- 4. 是什麼在LTO和海灣合作委員會之間的區別脂肪LTO-對象
- 5. 海灣合作委員會和ld參數
- 6. 海灣合作委員會內部原子比較和交換
- 7. 「海灣合作委員會」 的命令是指 「perl」 的
- 8. 海灣合作委員會源代碼中的函數
- 9. 鏈接到海灣合作委員會的庫
- 10. 我如何強制海灣合作委員會'bool'的大小
- 11. VLA的內存可用於海灣合作委員會
- 12. 交叉編譯海灣合作委員會的失敗(Python)
- 13. 海灣合作委員會,奇怪的整數推廣計劃
- 14. 海灣合作委員會的元組模板
- 15. 瞭解海灣合作委員會'-fmem-report`的輸出
- 16. C++ 0x:線程,海灣合作委員會或我的錯誤?
- 17. 手動定義外部符號與海灣合作委員會
- 18. Fedora 21與叮噹,沒有海灣合作委員會
- 19. 分叉一個孩子,並調用海灣合作委員會
- 20. 使用編譯包(POP,1)與海灣合作委員會
- 21. 海灣合作委員會將私人繼承到父母
- 22. 如何防止海灣合作委員會內聯
- 23. boost無法移動scoped_lock與海灣合作委員會
- 24. 從海灣合作委員會鏈接到winmm.dll
- 25. 功能指針與海灣合作委員會,分配地址
- 26. LAPACK與海灣合作委員會啓動指南
- 27. 食人魔構建海灣合作委員會4.7
- 28. 交叉編譯海灣合作委員會
- 29. 控制海灣合作委員會優化
- 30. 海灣合作委員會禁止標誌
不是'-Os'優化大小和'-O1','-O2','-O3 '爲了速度? – fvdalcin
'-Os'優化了可執行文件的大小。你可以看到哪些特定的標誌被打開[這裏](http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html)。 – BoBTFish
[「-Os:優化大小 - -Os啓用所有-O2優化,通常不會增加代碼大小,還會執行進一步的優化以減少代碼大小。」](http://gcc.gnu.org/onlinedocs /gcc/Optimize-Options.html)。將它用於嵌入式平臺,其中代碼大小可能比出血速度更重要(或者您甚至可能無法通過O3獲得更多速度,只是更大的代碼大小) –