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

问题描述 投票:0回答:4

我在 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; ......................

它基本上填充了一个复杂的结构。但我想编译器并没有那么复杂。

Debug模式速度很快,只有Relase模式有这个问题。在我这18000行代码之前,它们都是没问题的。 (此时数据位于外部位置)。然而,发布模式做了很多工作,将 exe 的大小从 1,800kb 减少到 700kb。

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

optimization visual-c++ linker
4个回答
3
投票

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

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

即使在新的四核上编译 18,000 行模板元编程和 1.5 小时的链接也不会完全让我感到惊讶。


2
投票

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

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


0
投票

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


0
投票

正如评论之一所述,您可能启用了 Link Time Code Generation (

/LTCG
),这会将大部分代码生成和优化移至链接阶段。

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

C++ 团队表示,他们已经显着优化了 VS 2010 的链接器

© www.soinside.com 2019 - 2024. All rights reserved.