VS2017 C ++链接器速度非常慢

时间:2018-02-21 11:57:32

标签: c++ visual-studio performance linker visual-studio-2017

我们正在将我们的C ++项目从VS2013升级到VS2017。但是在VS2017中,我们的调试版本的链接时间也非常糟糕。有了这样的价值观,就不可能进行有效的发展。

当我更改项目中的单个文件时,在VS2013中需要2.6秒。当我在VS2017中使用相同的文件执行相同操作时,需要30秒。

VS2013
1>       32 ms  ComputeCLOutputs                           1 calls
1>      199 ms  WarnCompileDuplicatedFilename              1 calls
1>     2688 ms  Link                                       1 calls
1>     4073 ms  ClCompile                                  1 calls

VS2017
1>       31 ms  ComputeCLOutputs                           1 calls
1>       44 ms  CustomBuild                                1 calls
1>      239 ms  WarnCompileDuplicatedFilename              1 calls
1>     8021 ms  ClCompile                                  1 calls
1>    29725 ms  Link                                       1 calls

这比VS2013慢15倍。

目前,我在我的电脑上安装了Visual Studios,因此我可以并排测试它。我尝试过很多东西,就像很多谷歌搜索一样但没有成功。

我试过了:

  • 在VS2017中编译相同的项目但使用VS2013工具集并且链接需要2.6秒。所以问题在于VS2017中的工具集而不是VS2017 IDE。

  • 我尝试了很多与DebugInformationFormat的组合,如/ Zi和/ Z7,与/ DEBUG vs / DEBUG相同:Fastlink,/ INCREMENTAL,...但是任何其他设置甚至比默认的设置更差QMake(/ Zi + / DEBUG:Fastlink + / INCREMENTAL)。

  • 我也试过32位和64位编译器/链接器和32 / 64bit目标一样。但它对性能没有任何影响。

  • 我尝试将VS2013项目转换为VS2017,就像通过Qt Qmake生成新项目一样,但也没有任何差异。

在链接时,CPU不使用100%,而不是100%使用SSD驱动器。我试图输出详细的链接日志,但没有任何特殊的东西(没有其他答案中提到的外国临时文件等)。

这是完整的编译器命令行

/Yu"stdafx.h" /MP /GS /analyze- /W3 /wd"4577" /wd"4467" /Zc:wchar_t /I ...INCLUDE FOLDERS... /Zi /Gm- /Od /Fd"objs\Debug32\" /FI"stdafx.h" /fp:precise 
/D "_WINDOWS" /D "UNICODE" /D "WIN32" /errorReport:prompt /WX- /Zc:forScope /Gd /Oy- /MDd /Fa"objs\Debug32\" /EHsc /nologo /Fo"objs\Debug32\" 
/Fp"Debug32\\App.pch" /diagnostics:classic 

-Zc:rvalueCast -Zc:inline -Zc:strictStrings -Zc:throwingNew -Zc:referenceBinding -Zm130 -w44996 -w34100 -w34189 -w44996 -w44456 -w44457 -w44458 

和链接器命令行

/OUT:"Debug32\\App.exe" /MANIFEST /NXCOMPAT /PDB:"Debug32\App.pdb" /DYNAMICBASE "Q:\SharedLibraries2017\Qt32\lib\qtmaind.lib" "shell32.lib" ...
 /VERSION:"1.0" /DEBUG /MACHINE:X86 /SAFESEH /INCREMENTAL /PGD:"Debug32\App.pgd" /SUBSYSTEM:WINDOWS /MANIFESTUAC:"level='asInvoker' uiAccess='false'" 
 /ManifestFile:"_App\objs\Debug32\App.exe.intermediate.manifest" /ERRORREPORT:PROMPT /NOLOGO /LIBPATH:"Q:\SharedLibraries2017\Qt32\lib" /TLBID:1 

"/MANIFESTDEPENDENCY:type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' publicKeyToken='6595b64144ccf1df' language='*' processorArchitecture='*'" 

我发现一些关于慢速链接的帖子,但没有任何帮助(64位,删除临时文件,同步/差异控制/代码转换/诊断,新文件夹中的干净构建,......)。

我正在使用最新的VS2017版本15.5.6,工具集v141,SDK 10.0.16299.0

任何帮助将不胜感激。

添加了:

我的电脑设置是: i7-7700K CPU @ 4.2Ghz 16GB拉姆 SSD驱动器 最新的Win10

编辑:

我尝试了另一个(较小的)项目。

当我完成重建时,我得到了这些结果:

VS2013:
1>     2898 ms  Link                                       1 calls
1>    11987 ms  CustomBuild                                1 calls
1>    68238 ms  ClCompile                                  1 calls

VS2017
1>     2822 ms  Link                                       1 calls
1>    14221 ms  CustomBuild                                1 calls
1>    67243 ms  ClCompile                                  1 calls

结果几乎相同。但是,当我在两个项目中更改例如main.cpp并进行编译+链接时,我得到了这个:

VS2013:
1>      577 ms  Link                                       1 calls
1>     1261 ms  ClCompile                                  1 calls

VS2017
1>     1196 ms  ClCompile                                  1 calls
1>     3145 ms  Link                                       1 calls

所以,问题似乎是没有多少文件链接在一起,在VS2017中的时间仍然是相同的。

EDIT2:

基于@seccur的想法我也安装了VS2015工具包

同样,两个相同的项目,都完全编译和链接和在我moddified main.cpp文件。

VS2015 (2015 v140)
1>       64 ms  WarnCompileDuplicatedFilename              1 calls
1>      594 ms  Link                                       1 calls
1>     1312 ms  ClCompile                                  1 calls

VS2017 (2017 v141)
1>       43 ms  WarnCompileDuplicatedFilename              1 calls
1>      754 ms  ClCompile                                  1 calls
1>     2082 ms  Link                                       1 calls

两个项目都在VS2017 IDE中打开,两者都具有相同的设置,唯一的区别是工具包选择。很明显,v141工具包已被完全窃听。

0 个答案:

没有答案