为什么Visual Studio 2010(msbuild?)构建速度不快?

4
通常在使用Visual Studio 2010构建包含多个项目的大型解决方案时,Windows 7资源监视器会显示devenv.exe未响应,但平均CPU读数很低,例如0.91,如下所示:

Visual Studio 2010 slow build on AMD Phenom II x4

这是在Windows 7 x64上,使用AMD Phenom II 920四核CPU和8 GB RAM时的情况。Visual Studio没有响应,但它似乎几乎没有使用任何CPU资源。
当我尝试使用msbuild.exe运行构建并使用开关“/maxcpucount:4”时,平均CPU值仍然很低,RHS图表从未显示超过5-10%的值。
为什么Visual Studio 2010(或msbuild)在构建期间似乎没有利用CPU?

7
电脑性能不仅仅与CPU有关,例如:从磁盘读取解决方案花费了多少时间? - vcsjones
如果你的系统内存不足,那么你的页面文件就会频繁交换,编译速度也会变得非常缓慢。包含许多 #include 的大型翻译单元很容易消耗数百兆字节的内存。将其乘以并行进程数量,你的系统内存很容易被消耗完几个千兆字节。 - Adam Rosenfield
@vcsjones 我在打开项目时检查了资源监视器中的磁盘使用情况,发现它接近1 MB/s。@Adam 我曾经看到Windows 7有时会在我打开几个大型解决方案并且我已经很久没有重新启动时显示“内存不足”的消息,但在这种情况下,我使用了8 GB RAM中的3-4个。 - T. Webster
我也有同样的想法,这里的答案似乎没有解释得很清楚。我的CPU使用率为17%,RAM使用率为30%,磁盘使用率为1%。为什么它不能充分利用我的计算机?构建似乎在超级计算机或土豆上花费相同的时间。这没有意义。最好是购买5台垃圾电脑并使用Incredibuild跨越它们进行构建。 - Gary Carlyle Cook
3个回答

5

构建项目可能涉及大量的磁盘I/O。这可能需要相当长的时间,但不会产生太多的CPU负载。

至于为什么显示为无响应,我猜测是由于构建过程由于某种原因(比如实现不佳)阻止了应用程序对操作系统请求的响应。一个应用程序并不需要达到100%的CPU利用率才被认为是“无响应”,它只需要在某个地方卡住主线程,使其不能及时响应操作系统即可。


它只使用了1%的磁盘,但速度非常慢。CPU和RAM也没有被充分利用。为什么不充分利用这些资源呢? - Gary Carlyle Cook

2

看起来MSBuild不喜欢并行构建多个项目,只能并行构建一个项目中的多个文件。


这个回答如何帮助解决问题? - oɔɯǝɹ
2
原始问题是“为什么Visual Studio 2010(或msbuild)在构建过程中似乎没有利用CPU(s)的优势?”我的回答意味着所有其他答案都不符合我的经验。这里的最佳答案说这是一个I/O问题。这完全不是事实。我有一个4x Vertex3 RAID0驱动器阵列和一台拥有24个逻辑核心和192 GB RAM的计算机正在构建这些项目。除非我设置/MP参数(它会在1个项目中构建多个文件),否则我的CPU利用率会保持在单核标记处。 - Ho Cheung
啊,好的。“不喜欢”这个措辞把我搞糊涂了。所以你是说你必须覆盖默认设置(可以向后兼容、安全的默认设置)才能进行并行构建? - oɔɯǝɹ
不,我的意思是说,据说Visual Studio可以并行构建项目。然而,事实并非如此。/M P参数将允许编译器编译属于同一项目的多个文件。但是,这是一个大问题,因为我们希望多个非依赖项目可以并行构建。这也不是仅限于那一台机器。我们拥有从净书到40核服务器的所有设备都遇到了相同的问题。 - Ho Cheung

0
为什么它运行缓慢且不符合预期?嗯,因为它是使用尖端技术从头构建的。这就是原因!
(抱怨:在我看来,VS 2010 是一个巨大的退步。 VS 2008 更加稳定/响应(而且可以工作),但让我们把个人观点放在一边)
利用多核心的两个解决方法:
  • 按照这里所述将MSBuild设置为外部工具,并分配一个快捷键(如Ctrl + Shft + B)以便快速访问。
  • MSBuild任务的BuildInParallel属性设置为true

    <Target Name="RunInParallel">
      <MSBuild BuildInParallel="true"
               Projects="@(Projects)"
               Targets="RunCodeAnalysis">
      </MSBuild>
    </Target>
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接