为什么VC ++ 2008编译器在链接阶段花费太多时间?

时间:2009-08-04 21:29:01

标签: visual-c++ optimization compiler-construction linker

我在C ++项目中有自动生成的代码(大约18,000行,基本上是数据包)和其他大约2,000行代码。该项目启用了链接时优化操作。 / O2和快速代码优化。为了编译代码,VC ++ 2008 express需要非常长的时间(大约1.5小时)。毕竟,它只有18,000行,为什么编译器花了这么多时间?

对18,000个代码的一点解释。它是普通的C,甚至不包括许多解包的for循环的C ++,样本将是:

a [0] .a1 = 0.1284; a [0] .a2 = 0.32186; a [0] .a3 = 0.48305; a [1] .a1 = 0.543; ..................

它基本上填充了一个复杂的结构。但我觉得编译器并不那么复杂。

调试模式很快,只有Relase模式有此问题。在我拥有18,000行代码之前,它们都很好。 (那时数据在外部位置)。但是,释放模式可以完成许多工作,将exe的大小从1,800kb减少到700kb。

此问题确实发生在链接阶段,因为生成了所有.obj文件。我也怀疑链接时代码生成,但无法弄清楚哪里出错。

4 个答案:

答案 0 :(得分:3)

影响链接时间的因素包括但不限于:

  • 计算机速度,尤其是可用内存
  • 构建中包含的库。
  • 编程范例 - 您是否有机会使用提升?

18,000行模板元编程甚至是新的四核编译和1.5小时的链接也不会让我感到惊讶。

答案 1 :(得分:2)

从历史上看,缓慢的C ++计算的一个常见原因是包含过多的头文件,通常是模块化不良的结果。您可以通过在许多小源文件中包含相同的大标头来获得大量冗余编译。这些案例中通常的引用是Lakos

您没有说明您是否使用预编译的标头,这是头文件重构的快速和脏的替代。

答案 2 :(得分:0)

这就是我们为我们的调试版本生成大量DLL的原因,但通常会将它们链接到我们的发布版本中。处理更多单片可执行文件更容易(对于我们的特定目的),但链接需要很长时间。

答案 3 :(得分:0)

如其中一条评论中所述,您可能已启用Link Time Code Generation/LTCG),这会将大部分代码生成和优化移至链接阶段。

这可以实现一些惊人的优化,但也会显着增加链接时间。

C ++团队说明了optimized the linker for VS 2010