[英]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.