2014-02-24 37 views
2

考慮一個簡單的情況:從源代碼構建編譯器會導致更好的優化嗎?

我下載一個C++編譯器的預編譯的二進制文件(比如CLangGCC或其他任何東西),我的通用操作系統(不是窗口)。我編譯我的代碼,其中包含一些計算昂貴的數學計算,其優化標記爲-O3,我的執行時間爲T1

在另一次嘗試中,這次不是使用預先構建的二進制文件,而是下載源代碼並在我的通用計算機上自行構建編譯器。我使用相同的優化標誌編譯相同的代碼,實現時間T2

請問T2 < T1或者他們會差不多呢?

換句話說,執行時間與編譯器的編譯方式無關嗎?你的代碼的

+2

您是否懷疑預構建的二進制文件是以這種方式構建的,而忽略了它可能做的某些優化?如果是這樣,爲什麼? – geoffspear

+1

我只希望編譯時間改變。 – Nobody

+0

@正確!我正在使用GCC,其他實驗室的同事都是CLANG的用戶。然而,我們所做的本質上是相似的,並不完全相同。他們告訴他們在叮噹時有更好的結果,但是,當我切換到叮噹時,我意識到我的GCC還是更好。當問他們時,他們都表示他們已經編譯了叮噹,而我使用了預製。我只是想知道這是否相關。 – Pouya

回答

7

編譯器的優化編譯器,而不是性能的編譯器行爲的結果。

只要編譯器具有相同的行爲設計,就會產生完全相同的輸出。

+1

更進一步,如果所有的編譯設置和環境都是相同的,那麼不僅編譯器的輸出是相同的,所產生的編譯器二進制文件也會與預先構建的完全相同(也許除時間戳之外,如果有的話)。 – Excelcius

+0

這不是攻擊,我只是想在接受答案之前澄清一切。你所說的是從機器(編譯器構建)獲取的編譯器的* no *屬性可能會影響執行時間。這個陳述是真實的嗎? – Pouya

+0

這在理論上是可能的,但超級不太可能。根據我所能說的,我會說你的區別僅僅是因爲你在不同的機器上進行測試。 – tenfour

1

在我看來,理論上編譯速度可以更快,因爲你可以說「編譯器編譯編譯器」,「請將目標指向我的電腦,並且你可以使用我的電腦處理器自己的機器代碼來優化」。

但我認爲編譯器的優化不能更快..爲了讓編譯器的優化更快,我認爲我們需要把諸如新技術的東西放進編譯器,而不僅僅是重新編譯。

1

這取決於如何實現該編譯器,並在您的平臺上,但答案很可能是「不」。

如果您平臺提供了一個可以提高程序的性能特定功能,在你的編譯器優化程序可能使用該功能來產生更快的程序。優化器只有在編譯器編寫者意識到該功能並在優化器中爲您的平臺實施了特殊處理時才能這樣做。 如果是,那麼可以在優化器中動態完成檢測,這意味着優化器的任何版本都可以檢測到平臺並優化代碼。只有如果檢測必須在優化器的編譯時出於某種原因發生,那麼在您的平臺上重新編譯它可能會帶來這種優勢。但是如果這樣一個更好的版本存在,編譯器供應商很可能已經爲它提供了二進制文件。

所以,所有這些ifs,當您在您的平臺上重新編譯編譯器時,您的程序不會更快。但是,如果編譯器針對您的平臺而不是通用二進制文件進行了優化,則編譯器會更快一些,從而縮短編譯時間。

2

通常,相同的編譯器版本應該在給定相同C或C++代碼輸入的情況下生成相同的彙編代碼。但是,某些事情可能會進一步影響運行編譯器時正在執行的代碼。

  • 發行版可能會從其他版本向後移植(甚至創建自己的)修補程序。
  • 現代編譯器經常有圖書館depenencies(如cloog),可能有不同的版本不同的行爲,從而使編譯器進行代碼生成的決策依據實質上其他數據
  • 這些庫可以(在某些版本的編譯器)是在可選編譯時間(可能需要給予 - 啓用交換機配置,或配置嘗試自動檢測它們)。
  • -march=native這樣的編譯器開關將查看您編譯的硬件並嘗試相應地進行優化。
  • 編譯器優化器觸發器的時間限制,基本上可以更好地優化更好的機器;或者對於內存來說是相同的(雖然我認爲這不再是在現代編譯器中可以找到的)

也就是說,即使是相同的彙編程序也可能在您的機器和它們的機器上執行不同的操作。因爲一個針對AMD進行了優化,另一個針對intel。