我有一个遗留的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文件。
此外,是否有任何文档可以解释每个步骤的作用?
答案 0 :(得分:4)
“MD Merge”步骤正在寻找并合并重复的字符串文字和其他重复数据。请注意,执行此操作所需的时间比您拥有的字符串文字数量多O(n ^ 2),因此我曾遇到类似问题,其中带有~10K字符串文字的头文件需要5分钟才能链接。
添加链接器标志/OPT:NOICF
可能会有所帮助。或者,请检查为什么要折叠这么多文字。
答案 1 :(得分:1)
希望来自vs开发团队的人能够看到这个并能够发表评论,也许会发布一个链接到他们的论坛/博客并开启最佳状态?
我遇到的第一个随机理论是调查生成多少内部代码,这样“阶段1”就可以做很多工作来消除欺骗。我特别想到模板或宏或旧式常量声明。通过包含在一个常见的预编译头文件中,这些也会受到干扰,因为我经常看到使用项目的windows / mfc / STL的天真设置。
祝你好运,如果你发现一些特别糟糕的东西,那将会很棒。