为啥 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?) 构建速度不快?的主要内容,如果未能解决你的问题,请参考以下文章

MS Visual Studio 2010 如何使用 .asm 生成的文件

MS VIsual Studio 2010 中的问题 Glut lib 工作

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

为啥 Visual Studio 2010 (Intellisense) 会停止生成接口指针?

为啥以下无法在 Visual Studio 2010 C++ 下编译?

为啥 Visual Studio 2010 在 VMware 中出现渲染问题?