【问题标题】:Visual C++ 2008: Finding the cause of slow link timesVisual C++ 2008:查找链接时间缓慢的原因
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 为什么是 O(N²)?好像是 O(n log n)?
  • 来自文档 - The optional iterations parameter specifies the number of times to traverse the symbols for duplicates. The default number of iterations is two. Additional iterations may locate more duplicates that are uncovered through folding in the previous iteration.
【解决方案2】:

希望 vs 开发团队中的某个人会看到这一点并能够发表评论,或者发布指向他们的论坛/博客的链接并争取最好的结果?

我想到的第一个随机理论是调查生成了多少内标头代码,这样“阶段 1”就需要做大量工作来消除欺骗。我特别考虑模板或宏或旧式常量声明。这些也可以通过包含在一个常见的预编译头文件中来加剧,因为我经常看到使用项目的 windows/mfc/STL 天真设置。

祝你好运,如果你发现一些特别不好的东西,我会很高兴。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-29
    • 1970-01-01
    • 1970-01-01
    • 2022-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多