Visual studio 2010 为什么';Visual Studio 2010(msbuild?)能否更快地构建?

Visual studio 2010 为什么';Visual Studio 2010(msbuild?)能否更快地构建?,visual-studio-2010,msbuild,Visual Studio 2010,Msbuild,通常,在Visual Studio 2010中构建包含多个项目的大型解决方案时,Windows 7资源监视器会显示devenv.exe没有响应,但平均CPU读取的数值较低,如图所示: 这是在Windows7x64上,带有AMD Phenom II920 4核CPU和8GB RAM。VisualStudio没有响应,但它似乎几乎没有使用任何CPU资源 当我尝试使用msbuild.exe和开关“”运行构建时,平均CPU值仍然很低,并且RHS图从未显示超过5-10%的值 为什么VisualStudi

通常,在Visual Studio 2010中构建包含多个项目的大型解决方案时,Windows 7资源监视器会显示devenv.exe没有响应,但平均CPU读取的数值较低,如图所示:

这是在Windows7x64上,带有AMD Phenom II920 4核CPU和8GB RAM。VisualStudio没有响应,但它似乎几乎没有使用任何CPU资源

当我尝试使用msbuild.exe和开关“”运行构建时,平均CPU值仍然很低,并且RHS图从未显示超过5-10%的值


为什么VisualStudio2010(或msbuild)在构建过程中似乎没有利用CPU

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


至于为什么它显示为没有响应,我的猜测是构建过程出于某种原因(比如,有人在实现它时做得很差)阻止了应用程序响应来自操作系统的请求。应用程序不需要达到100%的CPU利用率才能被视为“无响应”,它只需要将其主线程卡在某个位置,从而阻止它及时响应操作系统

为什么它速度慢,不能按预期工作?嗯,因为它是用尖端技术从头开始建造的。这就是为什么

(咆哮:VS 2010是一个巨大的倒退。VS 2008更稳定/反应更灵敏(而且有效),但让我们把个人意见放在一边)

利用多核优势的两种变通方法:

  • 按照概述将MSBuild设置为外部工具,并为其指定 快捷方式(如Ctrl+Shft+B)用于快速访问
  • BuildInParallel
    MSBuild任务的属性设置为
    true

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

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

计算机的性能远不止CPU。例如;从磁盘读取解决方案花费了多少时间?如果您的系统内存不足,您将开始疯狂地翻动页面文件,编译速度将减慢到爬行速度。一个包含大量
#include
的大型翻译单元很容易消耗数百兆字节。乘以并行进程的数量,您可以轻松地消耗千兆字节。@vcsjones我在打开项目时在资源监视器中检查了磁盘使用情况,发现它接近1 MB/s@Adam我看到Windows 7有时会显示一条“内存不足”消息,当我打开几个大型解决方案并且有一段时间没有重新启动时,但在这个例子中,我使用了8 GB内存中的3-4个。我也这么想,这里的答案似乎没有太多解释。我使用了17%的CPU。30%内存。1%磁盘。为什么它不利用我的机器呢。在超级计算机或土豆上构建似乎需要同样的时间。没有道理。我最好买5台垃圾计算机,并用Incredibuild跨它们进行构建。这个答案对这个问题有什么帮助?最初的问题是“为什么Visual Studio 2010(或msbuild)在构建过程中似乎没有利用CPU?”我的回答意味着所有其他答案都不符合我的经历。这里最重要的答案是这是一个I/O问题。事实并非如此。我有一个4x Vertex3 RAID0驱动器阵列和一台具有24个逻辑内核和192 GB RAM的计算机来构建这些项目。除非我设置/MP参数(它在一个项目中构建多个文件),否则我的CPU利用率将保持在1-core标记。啊,好的。“不喜欢”这句话让我很反感。那么你是说你必须覆盖默认的(可能向后兼容的,安全的)不并行构建的默认值?不,我的意思是Visual Studio应该并行构建项目。然而,情况似乎并非如此。/MP参数将允许编译器编译属于同一项目的多个文件。然而,这是一个大问题,因为我们希望并行构建多个非依赖项目。这也不是与那台机器隔离的。从上网本到40个核心服务器,我们都有相同的行为。对我来说,它只使用了1%的磁盘,速度非常慢。也没有使用太多的CPU或RAM。为什么不利用这些资源呢。