真的很难说。
我在工作中致力于改善我们项目的编译时间,发现一个文件花了 15 分钟(在 编译时-O2
,但在 15 秒左右-O0
)并被编译两次,因此总编译时间约为 60-70 分钟,这大约是一半的时间。关闭一个优化功能使一个文件缩短到大约 20 秒而不是 15 分钟......这个文件正在生成一个由机器生成的函数,并且有几万行长,这导致编译器做一些魔法长的东西(大概是一些 O(N^2) 算法)。
如果您有一个小函数然后依次调用许多小函数,最终通过内联层变成一个大文件,也会发生这种情况。
在其他时候,我发现减少文件数量并将更多代码放在一个文件中效果更好。
一般来说,我的经验(无论是我自己的编译器项目,还是其他人/公司的编译器)都不是花时间解析和读取文件,而是各种优化和代码生成过程。-fsyntax-only
您可以通过使用或为您的编译器调用的任何文件编译所有文件来尝试这一点。这将只是阅读源代码并检查它在语法上是否正确。-O0
如果您还没有,请尝试编译。通常一个特定的优化传递是问题,并且一些传递比其他传递更差,因此检查特定-O
选项中存在哪些单独的优化传递是有用的 - 在 gcc 中可以用-Q -O2 --help=optimizers
[在这种情况下为-O2
] 列出。
你真的需要弄清楚编译器花时间在什么上面。如果问题在于您花费大部分时间优化代码,那么更改代码是没有意义的。如果时间花在解析上,那么减少优化器是没有意义的,而优化不会增加额外的时间。如果没有实际构建您的项目,很难确定。
另一个提示是检查top
你的编译进程是否每个都使用 100% cpu - 如果不是,你的编译机器可能没有足够的内存。我的工作项目有一个构建选项,它通过运行如此多的内存“杀死”我的台式机,整个系统只是停止运行——即使在网络浏览器中从一个选项卡切换到另一个选项卡也需要 15-30 秒。唯一的解决方案是少跑一些-j
[当然,我通常会忘记,然后——所以如果我不想打断它,我会去吃午饭、喝咖啡或其他一些东西直到它结束,因为机器只是无法使用]。这仅适用于调试版本,因为将大型代码库的调试信息放在一起会占用大量内存 [显然!]