我遇到一个奇怪的问题,当我尝试编译包含需要的速度被高度优化的一些重要的计算算法两个源文件。奇怪的编译速度优化的结果 - 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