奇怪的编译器速度优化结果 - IAR编译器

时间:2015-04-23 07:56:15

标签: c compiler-optimization

当我尝试编译两个包含一些需要针对速度进行高度优化的重要计算算法的源文件时,我遇到了一个奇怪的问题。

最初,我有两个源文件,我们称之为A.cB.c,每个文件都包含多个相互调用的函数(来自文件的函数)可以调用其他文件中的函数)。我使用全速优化编译这两个文件,然后当我在应用程序中运行主算法时,运行 900 ms

然后我注意到两个文件中的函数从逻辑的角度来看是混淆的,所以我将一些函数从A.c移到B.c;让我们调用新文件A2.cB2.c。我还通过移动相应的声明更新了两个标题A.hB.h

将函数定义从一个文件移动到另一个文件是我做的唯一修改!

奇怪的结果是,在我使用相同的优化再次编译这两个文件后,算法现在需要 1000 ms 才能运行。

这里发生了什么?

我怀疑发生了什么:当函数f调用函数g时,在同一个文件中允许编译器用内联代码替换实际函数调用作为优化。如果不同时编译定义,则不再可能这样做。

  1. 我的假设是否正确?
  2. 除了重新组合之前的函数定义之外,我还能做些什么来获得与以前相同的优化?我研究过,似乎不可能将两个源文件同时编译到一个目标文件中。汇编的顺序是否重要?

1 个答案:

答案 0 :(得分:3)

至于您的假设是否正确,最好的方法是检查汇编程序输出,例如使用gcc -Sgcc -save-temps将是查看编译器所做的最终方式。

至于将两个C源文件编译成单个目标文件,当然可行。只需创建一个AB.c,如下所示:

#include "A.c"
#include "B.c"

并编译

除非应该保持分开(例如两个C文件中可能存在的静态项),这应该有用(或者至少可以进行一些修改)。

然而,请记住优化口号:测量,不要猜测!您通过组合它们放弃了相当多的封装,因此请确保好处远远超过成本