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

Posted

技术标签:

【中文标题】为啥 Visual Studio 2010 (msbuild?) 构建速度不快?【英文标题】:why doesn't Visual Studio 2010 (msbuild?) build faster?为什么 Visual Studio 2010 (msbuild?) 构建速度不快? 【发布时间】:2011-07-16 03:15:55 【问题描述】:

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

这是在带有 AMD Phenom II 920 4 核 CPU、8 GB RAM 的 Windows 7 x64 上。 Visual Studio 没有响应,但它似乎几乎没有使用任何 CPU 资源。

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

为什么 Visual Studio 2010(或 msbuild)在构建期间似乎没有利用 CPU?

【问题讨论】:

计算机的性能远不止 CPU。例如;从磁盘读取您的解决方案花费了多少时间? 如果您的系统内存不足,您将开始疯狂地颠簸您的页面文件,并且编译速度会慢到爬行。具有大量#includes 的大型翻译单元可以轻松消耗数百兆字节。将其乘以并行进程的数量,您可以轻松消耗千兆字节。 @vcsjones 我在打开项目时在资源监视器中检查了我的磁盘使用情况,发现它接近 1 MB/s。 @Adam 当我打开几个大型解决方案并且我有一段时间没有重新启动时,我看到 Windows 7 有时会显示“内存不足”消息,但在这种情况下,我使用了 8 GB RAM 中的 3-4 个。 我也是这么想的,这里的答案似乎解释不了那么多。我使用了 17% 的 CPU。 30% 内存。 1% 磁盘。为什么它不利用我的机器。在超级计算机或土豆上构建似乎需要同样的时间。没有意义。对我来说,购买 5 台垃圾计算机并使用 Incredibuild 构建它们会更好。 【参考方案1】:

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

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

【讨论】:

我只使用了 1% 的磁盘,而且慢得要命。也不使用太多的 CPU 或 RAM。为什么不利用这些资源。【参考方案2】:

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

【讨论】:

这个答案对这个问题有什么帮助? 最初的问题是“为什么 Visual Studio 2010(或 msbuild)在构建期间似乎没有利用 CPU?”我的回答旨在暗示所有其他答案都不符合我的经历。这里的最佳答案说这是一个 I/O 问题。情况完全不是这样。我有一个 4x Vertex3 RAID0 驱动器阵列和一台具有 24 个逻辑内核和 192 GB RAM 的计算机来构建这些项目。除非我设置 /MP 参数(在 1 个项目中构建多个文件),否则我的 CPU 利用率将保持在 1 核标记。 啊,好的。 “不喜欢”的措辞让我失望。所以你是说你必须覆盖不并行构建的默认(可能向后兼容,安全)默认? 不,我的意思是 Visual Studio 应该会并行构建项目。然而,情况似乎并非如此。 /MP 参数将允许编译器编译属于同一项目的多个文件。但是,这是一个大问题,因为我们希望并行构建多个非依赖项目。这也不是与那台机器隔离的。我们拥有从上网本到 40 核服务器的所有产品,它们都具有相同的行为。【参考方案3】:

为什么它很慢并且没有按预期工作?好吧,因为它使用尖端技术从头开始构建。这就是为什么!

咆哮:恕我直言,VS 2010 是一个巨大的退步。VS 2008 更加稳定/响应迅速(并且有效),但让我们将个人意见放在一边)

利用多核的两种解决方法:

按照here 的概述将 MSBuild 设置为外部工具,并为其分配一个 用于快速访问的快捷方式(如 Ctrl+Shift+B)。

MSBuild任务的BuildInParallel属性设置为true

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

【讨论】:

以上是关于为啥 Visual Studio 2010 (msbuild?) 构建速度不快?的主要内容,如果未能解决你的问题,请参考以下文章