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目标,然后编译它们。但首先尝试链接时间优化器,这不是像把文件放在一起一样的破解。 –