【发布时间】:2011-02-15 13:35:34
【问题描述】:
我有一个遗留的 C++ 项目,构建时间非常长(几分钟,即使是很小的增量更改),我发现大部分时间都花在了链接上。
该项目已经在使用预编译头文件和增量编译。 我启用了“/time”命令行参数,希望能获得更多关于是什么导致链接器变慢的详细信息,并得到以下输出:
1>Linking...
1> MD Merge: Total time = 59.938s
1> Generate Transitions: Total time = 0.500s
1> MD Finalize: Total time = 7.328s
1>Pass 1: Interval #1, time = 71.718s
1>Pass 2: Interval #2, time = 8.969s
1>Final: Total time = 80.687s
1>Final: Total time = 80.953s
有没有办法获得有关每个步骤的更多详细信息? 例如,我想知道他们是否花费大部分时间链接到特定的 .lib 或 .obj 文件。
此外,是否有任何文档解释了每个步骤的作用?
【问题讨论】:
-
仅供参考,我们在这里讨论了多少个 .cpp 文件?作为有趣的参考,几年前我们有一个应用程序需要 12 小时才能链接(是的,一个巨大的库)。谢天谢地,它被分成了几十个组件,现在硬件更好了;)
-
180 个文件分布在 10 个项目中 + 依赖于 8 个外部 .lib 文件(MFC + 其他专有库);所以我认为这是合理数量的文件。但是,仍然可以通过拆分一些项目来改进结构。 (12 小时太糟糕了,你是如何完成工作的?)
-
哪个版本?您是否启用了链接时间代码生成或 Profiler 引导优化?
-
@peterchen:Visual Studio 2008 SP1,带有 .Net 3.5 的 C++/CLI。我没有启用任何一个选项。我尝试启用链接时间代码生成以查看它会产生什么样的差异,但是链接器因“内存不足”错误而失败(也许那里有一些需要调查的东西......)据我了解这些选项,他们通常会使链接变慢,因为链接器花费更多时间进行优化,对吗?
-
@ckarras:是的。对于使用 /LTCG 的大型项目,我想说 80 秒还不错 - 因为这意味着大多数优化在链接期间运行。不过,我对 CLI 的经验为零。假设您拥有一台功能强大的机器,链接期间的 OOM 听起来真的很糟糕。在 VC++ 团队博客上闲逛可能会有所帮助——我已经看到这些人在 cmets 部分诊断出各种非常具体的问题。或者尝试在 MS Connect 上报告 OOM。
标签: c++ visual-c++ linker