如何改进Visual C++编译时间?

Did*_*set 49 c++ comparison gcc visual-c++ compilation-time

我在每次提交时在buildbot中编译2个C++项目.两者都是大约1000个文件,一个是100 kloc,另一个是170 kloc.编译时间与gcc(4.4)到Visual C++(2008)有很大不同.

一个项目的Visual C++编译需要20分钟.他们无法利用多核,因为项目依赖于另一个.最后,在Debug和Release中对32和64位的两个项目进行完整的编译需要超过2 1/2小时.

一个项目的gcc汇编需要4分钟.它可以在4个核心上并行化,大约需要1分10秒.2个项目的4个版本(Debug/Release,32/64位)的所有8个版本都在不到10分钟的时间内编译完成.

Visual C++编译时发生了什么?它们基本上慢了5倍.

编译C++ kloc的平均时间是多少?我的是带有vc ++的7 s/kloc和带有gcc的1.4 s/kloc.

可以做任何事情来加快Visual C++上的编译时间吗?

小智 17

如果你有一个初始化非trival const值类型的具体实例的头文件,那么减慢VC++编译器的一件事就是.你可能会发现这种情况发生在类型std::string或GUID的常量上.它会影响编译和链接时间.

对于单个dll,这导致了10倍的减速.如果将它们放在预编译的头文件中,或者只是在头文件中声明它们并在cpp文件中初始化它们会有所帮助.

请查看病毒扫描程序,并确保尝试使用预编译的标头,如果没有它,您将无法看到VC++的最佳状态.

哦,是的,并确保%TMP%文件夹与编写构建的位置在同一分区上,因为VC++会生成临时文件并在以后移动它们.


jdi*_*isk 11

这些项目相互依赖并不意味着不可能实现并行化.构建系统足够智能,可以找出并避免关键的依赖性,否则gcc将无法使用4个核心.

所以(除了其他步骤),为什么不尝试使用/ MP在Visual Studio中启用多处理(请参阅http://msdn.microsoft.com/en-us/library/bb385193.aspx).

  • @dtrosset:VS2008*可以*由编译单元拆分.这就是/ MP标志的作用.在VS2005中,唯一可用的并行化形式是每个项目. (6认同)
  • 为什么他们都必须使用完全相同的标志?使自动构建使用/ MP和if/Gm在开发者机器上更快,而是在那里使用它. (5认同)
  • 因为Visual Studio中的多处理不能通过编译单元(.cpp文件)拆分工作,而只能通过项目拆分! (2认同)
  • Stange:至少我的机器(并且根据上面引用的文档)VS2008,VS2010 Beta2即使只构建一个项目也使用多个核心. (2认同)

Len*_*ate 6

你是如何构建Visual Studio项目的?你刚刚用项目运行ide(devenv),/build或者你有一个类似于我认为你用于gcc的makefile.我假设两个版本都使用类似的makefile,但我认为值得检查.

您是否为任一编译器使用预编译头文件?如果您没有为VS使用预编译头,那么您可能希望切换到使用它们.我个人建议使用这种#pragma hdrstop方法而不是一个包含所有内容的头文件,但是如果你当前没有使用预编译的头文件,并且想要尝试一个强制包含的单个全包头文件(使用/FI编译器命令行开关)无需任何代码更改即可快速测试.

我写了两个/FI,并#pragma hdrstop在这里: http://www.lenholgate.com/blog/2004/07/fi-stlport-precompiled-headers-warning-level-4-and-pragma-hdrstop.html


tom*_*myk 6

这不是问题的直接答案,但在我的公司,我们使用IncrediBuild进行分布式编译.它确实加快了编译过程.http://incredibuild.com/visual_studio.htm

  • Incredibuild可以在多台计算机上使用CPU核心,但当前的项目设置无法利用本地计算机上的所有核心.即,您首先需要解决这种级别的并行化问题. (2认同)