2012-04-27 56 views
-1

當我編寫例程來測試兩種東西的性能時,我應該使用哪種優化標誌? -O0,-O2或-g?測試兩種東西的性能,我應該使用哪種標誌(使用gcc)? -O0,-O2或-g?

+0

想一想。你是否認爲***也許***人需要知道什麼是編譯器或你在說什麼? ;-)這種風格的旗幟是幾個共同的。 – 2012-04-27 09:45:51

+0

@ T.J.Crowder人們喜歡發佈的軟件,所以我選擇-O2。謝謝。 – 2012-04-27 09:58:07

+1

@ user:您似乎錯過了一點,但至少您在問題的標題中添加了「with gcc」。 (提示:*這是什麼標籤*) – 2012-04-27 10:01:52

回答

1

您應該使用每個設置測試代碼的性能。理想情況下,數字越大-O0,-O1,-O2,-O3意味着更好的性能,因爲有更多/更好的優化,但情況並非總是如此。

同樣,根據你的代碼的寫法,它的一些可能以你從語言或編譯器或兩者都沒有期望的方式被刪除。因此,您不僅需要測試代碼的性能,還需要真正測試從代碼生成的程序,以確保它按照您的想法執行。

絕對沒有一個優化設置可爲編譯器編譯的任何代碼提供最佳性能。您必須測試特定系統上的設置和編譯器,以驗證該系統的代碼確實運行得更快。你如何測試性能是否充滿了許多陷阱和其他錯誤產生的問題,你很容易誤解結果。所以你必須小心如何測試你的表現。

對於gcc人們通常會說-O3有使用風險,-O2是最好的性能/安全。在大多數情況下,使用-O2足以使很多錯誤消失。 -O2並不總是產生最快的代碼,但它通常產生更快的代碼-O0和-O1。調試器的使用可能會使優化失敗或將其全部移除,因此請勿使用基於調試器的構建或使用調試器來測試性能。在用戶使用系統時測試系統,如果用戶在運行程序時使用調試器然後測試,否則不用。

0

在GCC中-O0完全禁用編譯器代碼優化。 -g向可執行文件添加了調試信息,以便您可以使用調試器。

如果要啓用速度優化,請使用標記-O1-O2。有關更多信息,請參閱man gcc(1)

如果要測量代碼的性能,請使用profiler,如valgrind或gprof。

0

其實,如果你關心性能,你一定要用-O3。爲什麼放棄潛在的優化?

是的,-O2-O3之間有一個小的但可測量的差異。

-g不是優化標誌,但它可以防止優化,因此必須禁用代表性基準。

+0

'O3'不一定比'O2'好,因爲我瞭解gcc。 O3會進行積極的內聯,可能會損害本地化並降低性能。因此總是一個好主意來檢查兩者,看看有什麼更好的表現。 – Voo 2012-04-27 11:44:34

+0

@Voo就像我說的,有基準。雖然'-O3'在病理情況下可能比'-O2'慢,它通常會更快或至少一樣快。特別是內聯通常不會降低性能,因爲優化器不會「愚蠢地」內聯,它仍然使用啓發式方法來確定執行速度是否會從內聯中受益。 – 2012-04-27 11:56:33