2015-04-23 88 views
2

我遇到一個奇怪的問題,當我嘗試編譯包含需要的速度被高度優化的一些重要的計算算法兩個源文件。奇怪的編譯速度優化的結果 - IAR編譯

最初,我有兩個源文件,我們姑且稱之爲A.cB.c,每個包含相互調用(從文件函數可以調用函數從其他文件)多種功能。我用全速優化編譯這兩個文件,然後當我在應用程序中運行主算法時,需要運行900 ms

然後我注意到從兩個文件被從邏輯上看混合起來的功能,所以還可以將一些功能從A.cB.c;我們稱之爲新文件A2.cB2.c。我也通過移動相應的聲明更新兩個頭A.hB.h

從一個文件移動功能定義,另一種是我做的唯一修改!

奇怪的結果是,在我以相同的優化再次編譯兩個文件後,算法現在需要1000 ms才能運行。

這是怎麼回事?

我懷疑發生了什麼:當函數f調用函數g時,在同一個文件中允許編譯器用內聯代碼替換實際函數調用作爲優化。當定義不同時編譯時,這是不可能的。

  1. 上午我在假設是正確的?
  2. 除了重組函數定義,因爲它以前,有什麼我可以做,以獲得相同的優化,前?我研究過,似乎不可能將兩個源文件同時編譯成單個目標文件。編譯的順序是否重要?
+0

1.這是可能的,但現代編譯器時下特徵鏈接時優化(LTO)。如果你的編譯器確實把它打開了, –

+0

嘗試在項目設置中打開*多文件編輯*。至少IAR ARM編譯器擁有它。警告:它可以嚴重增加您的編譯時間。 – user694733

+0

另外,您可能想要指定您的平臺。也許你正在使用某種分段內存,其中函數調用的成本取決於它從調用點到多遠。我不是這方面的專家,但其他人可能是。 – user694733

回答

3

至於你的假設是否正確,告訴最好的方法是檢查彙編輸出,如通過使用gcc -Sgcc -save-temps會看到你的編譯器做了什麼明確的方式。

至於編譯成兩個C源文件到一個單一的目標文件,這是當然可行。只要創建一個AB.c如下:

#include "A.c" 
#include "B.c" 

和編譯這一點。

除非事情保持分開(例如其可以在這兩個C文件存在靜態項),應該工作(或至少一個小修改工作)。

但是,請記住優化的口頭禪:措施,不要猜測!通過合併,你放棄了封裝的一小部分,所以確保好處遠遠超過成本。

+0

另外'-save-temps'允許在製作二進制文件時看到程序集。 – Bregalad

+0

作爲創建AB.c的替代方案,您可以創建一個將這兩個文件連接在一起的Makefile目標,然後編譯它們。但首先嚐試鏈接時間優化器,這不是像把文件放在一起一樣的破解。 –