[英]Strange compiler speed optimization results - IAR compiler
當我嘗試編譯包含某些重要計算算法的兩個源文件時,我遇到一個奇怪的問題,這些算法需要高度優化以提高速度。
最初 ,我有兩個源文件,我們稱它們為Ac
和Bc
,每個文件包含多個相互調用的函數(一個文件中的函數可以調用另一個文件中的函數)。 我會全速優化地編譯兩個文件,然后在應用程序中運行主要算法時,要花900毫秒才能運行。
然后我注意到從邏輯角度來看,這兩個文件中的功能是混合在一起的,因此我將一些功能從Ac
移到了Bc
; 我們將新文件A2.c
和B2.c
我還通過移動相應的聲明來更新兩個標頭Ah
和Bh
。
將功能定義從一個文件移動到另一個文件是我所做的唯一修改!
奇怪的結果是,在以相同的優化再次編譯兩個文件之后,該算法現在需要1000毫秒才能運行。
這里發生了什么?
我懷疑發生了什么:當函數f
調用函數g
,位於同一文件中允許編譯器將實際函數調用替換為內聯代碼以進行優化。 如果未同時編譯定義,則不再可能。
至於您的假設是否正確,最好的判斷方法是檢查匯編程序輸出,例如使用gcc -S
或gcc -save-temps
。 這將是查看編譯器已完成操作的確定方式。
至於將兩個C源文件編譯成一個目標文件,那當然是可行的。 只需創建一個AB.c
,如下所示:
#include "A.c"
#include "B.c"
並編譯。
禁止應分開工作的東西(例如兩個C文件中可能都存在的靜態項目)應該起作用的(或至少進行一些修改即可)。
但是,請記住優化原則: 測量,不要猜測! 通過將它們組合在一起,您將放棄很多封裝,因此請確保收益遠大於成本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.