我遇到一個奇怪的問題,當我嘗試編譯包含需要的速度被高度優化的一些重要的計算算法兩個源文件。奇怪的編譯速度優化的結果 - IAR編譯
最初,我有兩個源文件,我們姑且稱之爲A.c
和B.c
,每個包含相互調用(從文件函數可以調用函數從其他文件)多種功能。我用全速優化編譯這兩個文件,然後當我在應用程序中運行主算法時,需要運行900 ms。
然後我注意到從兩個文件被從邏輯上看混合起來的功能,所以還可以將一些功能從A.c
到B.c
;我們稱之爲新文件A2.c
和B2.c
。我也通過移動相應的聲明更新兩個頭A.h
和B.h
。
從一個文件移動功能定義,另一種是我做的唯一修改!
奇怪的結果是,在我以相同的優化再次編譯兩個文件後,算法現在需要1000 ms才能運行。
這是怎麼回事?
我懷疑發生了什麼:當函數f
調用函數g
時,在同一個文件中允許編譯器用內聯代碼替換實際函數調用作爲優化。當定義不同時編譯時,這是不可能的。
- 上午我在假設是正確的?
- 除了重組函數定義,因爲它以前,有什麼我可以做,以獲得相同的優化,前?我研究過,似乎不可能將兩個源文件同時編譯成單個目標文件。編譯的順序是否重要?
1.這是可能的,但現代編譯器時下特徵鏈接時優化(LTO)。如果你的編譯器確實把它打開了, –
嘗試在項目設置中打開*多文件編輯*。至少IAR ARM編譯器擁有它。警告:它可以嚴重增加您的編譯時間。 – user694733
另外,您可能想要指定您的平臺。也許你正在使用某種分段內存,其中函數調用的成本取決於它從調用點到多遠。我不是這方面的專家,但其他人可能是。 – user694733