簡體   English   中英

使用 -g gcc 標志編譯的程序是否比不使用 -g 編譯的相同程序慢?

[英]Is a program compiled with -g gcc flag slower than the same program compiled without -g?

我正在使用 -O3 編譯程序以提高性能,使用 -g 來編譯調試符號(如果發生崩潰,我可以使用核心轉儲)。 一件事讓我很困擾,-g 選項會導致性能下降嗎? 當我查看帶和不帶 -g 的編譯輸出時,我發現不帶 -g 的輸出比帶 -g 的編譯輸出小 80%。 如果額外的空間用於調試符號,我不關心它(我猜),因為這部分在運行時不使用。 但是,如果對於沒有 -g 的編譯輸出中的每條指令,我需要在編譯輸出中使用 -g 多執行 4 條指令,而不是我當然更願意停止使用 -g 選項,即使以無法處理核心轉儲為代價。

如何知道程序中調試符號部分的大小,一般來說,使用 -g 編譯會創建一個運行速度比不使用 -g 編譯的相同代碼慢的程序嗎?

引用gcc 文檔

GCC 允許您將 -g 與 -O 一起使用。 優化代碼所采取的捷徑有時可能會產生令人驚訝的結果:您聲明的某些變量可能根本不存在; 控制流可能會短暫地移動到您沒有預料到的地方; 有些語句可能無法執行,因為它們計算的是常量結果或它們的值已經在手上; 有些語句可能會在不同的地方執行,因為它們已被移出循環。

這意味着:

我會為你插入調試符號,但如果優化傳遞把它們搞砸了,我不會嘗試保留它們,你必須處理它

調試符號不會寫入代碼,而是寫入另一個稱為“調試部分”的部分,該部分甚至不會在運行時加載(僅由調試器加載)。 這意味着:沒有代碼更改。 您不應該注意到代碼執行速度的任何性能差異,但是如果加載程序需要處理更大的二進制文件或者它以某種方式考慮到增加的二進制文件大小,您可能會遇到一些緩慢的情況。 您可能必須自己對應用程序進行基准測試,才能在特定情況下 100% 確定。

請注意,gcc 4.8 中還有另一個選項

-Og

優化調試體驗。 -Og啟用不干擾調試的優化。 它應該是標准編輯-編譯-調試循環的首選優化級別,提供合理的優化級別,同時保持快速編譯和良好的調試體驗。

此標志影響性能,因為它將禁用任何會干擾調試信息的優化傳遞。

最后,甚至可能發生某些優化更適合特定架構而不是另一種架構的情況,除非指示針對您的特定處理器這樣做(請參閱您的架構的March/mtune選項),在 O3 gcc 中將盡最大努力通用架構 這意味着在某些人為的場景中,您甚至可能會遇到 O3 比 O2 慢的情況。 “盡力而為”並不總是意味着“最好的”。

暫無
暫無

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

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