我们正在将我们的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工具包已被完全窃听。