visualc&x2B+;2008:查找链接时间缓慢的原因 我有一个遗留的C++项目,花费了很长的时间来构建(几分钟,甚至是小的增量更改),我发现大部分时间都用在链接上。

visualc&x2B+;2008:查找链接时间缓慢的原因 我有一个遗留的C++项目,花费了很长的时间来构建(几分钟,甚至是小的增量更改),我发现大部分时间都用在链接上。,c++,visual-c++,linker,C++,Visual C++,Linker,该项目已经在使用预编译头和增量编译。 我启用了“/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.718

该项目已经在使用预编译头和增量编译。 我启用了“/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文件


另外,是否有任何文档说明了这些步骤的作用?

希望vs开发团队的人能够看到这些,并能够发表评论,或者在他们的论坛/博客上发布一个链接,以获得最佳效果

我想到的第一个随机理论是调查生成了多少头代码,这样“阶段1”就需要做大量的工作来消除重复。我特别想到的是模板、宏或旧式常量声明。如果将它们包含到一个公共的预编译头中,它们也会受到影响,正如我经常看到的那样,对于使用项目的windows/mfc/STL来说,这是非常幼稚的设置

祝你好运,如果你发现一些特别的不好的东西,那就太好了

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


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

仅供参考,我们在这里讨论的.cpp文件有多少?有趣的是,几年前我们有一个应用程序,链接需要12小时(是的,一个巨大的库)。谢天谢地,它被分成了几十个组件,现在硬件更好了;)180个文件分布在10个项目中+依赖于8个外部.lib文件(MFC+其他专有库);在我看来,这是一个合理数量的文件。但是,通过拆分一些项目,结构可能会得到改善。(12小时太糟糕了,你是如何完成工作的?)什么版本?是否启用了链接时代码生成或探查器引导的优化?@peterchen:Visual Studio 2008 SP1,C++/CLI和.Net 3.5。我没有启用这两个选项。我试着启用链接时代码生成,看看它会有什么不同,但是链接器失败了,出现了“内存不足”错误(可能有什么需要调查的…)据我所知,这些选项通常会使链接速度变慢,因为链接器花更多的时间进行优化,是吗?@ckarras:是的。对于一个带有/LTCG的大型项目,我认为80秒并不坏——因为这意味着大多数优化都是在链接期间运行的。不过,我对CLI没有任何经验。链接期间的OOM听起来非常糟糕,假设您有一台功能相当强大的机器。在VC++团队博客上闲逛可能会有所帮助——我在评论部分看到这些人诊断了各种非常具体的问题。或者尝试在MS Connect报告OOM。为什么是O(N²)?看起来是O(n log n)?从docs-
中,可选的iterations参数指定了遍历重复符号的次数。默认迭代次数为两次。额外的迭代可能会找到更多的重复项,这些重复项是通过在上一次迭代中折叠而发现的。