Visual C++ 2008:寻找链接时间缓慢的原因

9

我有一个老的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小时来链接(是的,一个巨大的库)。幸运的是,现在它已经被分成了几十个组件,并且硬件也更好了 ;) - Matthieu M.
有10个项目,共计180个文件,还依赖于8个外部.lib文件(包括MFC和其他专有库)。在我看来,这是一个相当数量的文件。但是,通过拆分一些项目,结构可能会得到改善。(12小时?太糟糕了,你怎么能完成任何工作呢?) - ckarras
@peterchen:Visual Studio 2008 SP1,使用.Net 3.5的C++/CLI。我没有启用这两个选项。我尝试启用链接时代码生成以查看它会产生什么样的差异,但链接器出现了“内存不足”错误(也许有什么需要调查的地方……) 据我所知,这些选项通常会使链接变慢,因为链接器花费更多时间进行优化,是这样吗? - ckarras
@ckarras:是的。对于使用/LTCG的较大项目,我会说80秒还不错-因为这意味着大部分优化都在链接期间运行。但我没有CLI方面的经验。如果在链接期间发生OOM(内存耗尽),那听起来确实很糟糕,假设你有一台相当强大的机器。逛逛VC++团队博客可能有所帮助-我看到人们在评论部分诊断各种非常具体的问题。或者尝试在MS Connect上报告OOM。 - peterchen
你有想到什么吗?编译性能是我非常关注的话题。 - peterchen
显示剩余2条评论
2个回答

4

"MD Merge"步骤旨在查找并合并重复的字符串常量和其他重复的数据。请注意,执行此操作所需的时间是O(n^2),其中n是您拥有的字符串常量数,因此我曾经遇到过类似问题,即一个包含约10K个字符串常量的头文件需要5分钟才能链接。

添加链接器标志/OPT:NOICF可能会有所帮助。或者,检查为什么有很多文字需要折叠。


为什么是O(N²)?它看起来应该是O(n log n)吧? - Sam Harwell
从文档中 - 可选的迭代参数指定遍历重复符号的次数。默认迭代次数为两次。额外的迭代可能会发现通过前一次迭代折叠而未被发现的更多重复项。 - Mark Ingram

1
希望VS开发团队的某个人能看到这个问题并且能够评论一下,或者发布他们论坛/博客的链接,希望最好的结果。

我首先想到的一个随机理论是要调查生成了多少头文件代码,以至于“第一阶段”需要做很多工作来消除重复项。 我特别考虑模板或宏或旧式常量声明。 这些也会由于包含在通用预编译头文件中而变得更加严重,因为我经常看到使用windows/mfc/STL项目的天真设置。

祝你好运,如果你找到了具体的糟糕东西,那将会是很不错的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接