2015-10-15 119 views
1

我的工作或績效評估和我遇到一個問題:當我加入一些指令,它的執行速度比最初的代碼快的代碼,我認爲由於編譯器優化(不指定任何)。GCC優化步驟

編譯器優化如何工作?特別是他們在將C轉換成彙編或從彙編到二進制代碼的步驟中執行? 我想兩者都可以知道在每個步驟中執行哪些優化?

我已經看過組裝,但所以我想,一些體系結構相關的優化涉及我只發現輕微差異。

謝謝!

+4

[這裏是一個雜談]由編譯器作家誰遇到一個問題,像這樣的,並解釋了它(https://www.youtube.com/watch?v=nXaxk27zwlk)。答案是_「編譯器是複雜的野獸」_。 – nwp

+0

有一個名爲「OPTIM_DISABLE」的標誌,您必須將其設置爲yes以禁用優化。如果你防止任何變量優化,然後使用易失性 –

+1

@SohilOmer你在哪裏看到那個標誌?要顯式禁用優化,在調用'gcc'時傳遞'-O0',但它已經是默認值。 'volatile'會阻止一些優化,但遠不是所有。 – pmr

回答

2

程序集是二進制代碼,適用於所有意圖和目的。大部分優化都是在將高級語言編譯爲程序集時發生的。奇怪的是,你添加了功能並且它變得更快了......但是編譯器優化是一種黑暗魔法。

您可以去它的底部,你可以編譯C到組件(GCC-S),看看它確實在考慮到您的版本......當然承擔着並非所有的指令都是一樣的,如果你對組裝有一定的瞭解,以及CPU,總線和內存等是如何工作在較低水平的話,這將對你有所幫助。

+0

謝謝你的回答。我還沒有分析程序集,大致使用特定於我的cpu的表來計算成本。 我的擔心是關於隱藏的通用寄存器的使用,那些改進直接由CPU執行,而不是從彙編轉換爲二進制? 我想流水線是由CPU直接處理的,對吧? –

+0

並非完全,CPU在執行指令時對流水線負責,但編譯器知道流水線並可能會採取步驟來生成組合,從而充分利用它,例如重新排序指令。 – Michael

+0

所以,當我使用gcc -S獲得程序集時,它仍然被優化以充分利用流水線,並且二進制代碼中的以下轉換幾乎不是1:1的轉換ams_op - > bin_op? –