【发布时间】:2015-04-23 07:56:14
【问题描述】:
当我尝试编译两个包含一些需要高度优化以提高速度的重要计算算法的源文件时,我遇到了一个奇怪的问题。
最初,我有两个源文件,我们称它们为A.c和B.c,每个都包含多个相互调用的函数(一个文件中的函数可能调用另一个文件中的函数) .我用全速优化编译这两个文件,然后当我在应用程序中运行主算法时,它需要 900 毫秒 才能运行。
那么我注意到两个文件中的函数从逻辑上看是混淆的,所以我将一些函数从A.c移到B.c;让我们将新文件称为A2.c 和B2.c。我还通过移动相应的声明来更新A.h 和B.h 这两个标题。
将函数定义从一个文件移动到另一个文件是我所做的唯一修改!
奇怪的结果是,在我用相同的优化再次编译这两个文件后,算法现在需要 1000 毫秒 才能运行。
这是怎么回事?
我怀疑会发生什么:当函数 f 调用函数 g 时,在同一个文件中允许编译器将实际函数调用替换为内联代码作为优化。如果没有同时编译定义,这将不再可能。
- 我的假设是否正确?
- 除了像以前一样重新组合函数定义之外,我还能做些什么来获得与以前相同的优化?我研究过,似乎不可能同时将两个源文件编译成一个目标文件。编译顺序是否重要?
【问题讨论】:
-
1.这是可能的,但现在现代编译器具有链接时优化 (LTO)。如果您的编译器打开,请尝试打开它。
-
尝试在项目设置中开启多文件编译。至少 IAR ARM 编译器有它。警告:它会严重增加编译时间。
-
另外,您可能需要指定您的平台。也许您正在使用某种分段内存,其中函数调用的成本取决于它与调用点的距离。我不是这方面的专家,但其他人可能是。