加速 Visual Studio 构建






4.98/5 (23投票s)
本文讨论了如何缩短构建时间
最近我参与了一个大型项目,其中我们有一个包含大约 100 个项目的解决方案。
为什么一个解决方案中有 100 个项目?
拥有 100 个项目解决方案的原因在于,像现在许多模块化系统一样,我们有以下三个层级
- 一些核心/通用项目,每个项目都会使用。
- 大量的模块,彼此独立。这个层级直接依赖于第一层。
- 一些最终项目,加载不同的模块。这个层级间接依赖于第二层。
所以,是的,我们可以创建多个解决方案,每个层级只在需要时编译,并使用 DLL 引用代替项目引用,但所有层级的更改数量仍然足够大,而且我已经看到这种构建过程惨败。所以这是不可行的。
整个解决方案的构建时间需要 15 分钟。由于我们在公司强制执行了门控签入策略,这对开发人员来说确实是一个痛点。
请注意,开发人员的电脑配置足够强大,拥有 8GB 内存、Intel Core i7 CPU 和 SSD 磁盘。
所以我开始调查可以做些什么来改善这种情况。
步骤 1:并行构建项目
尽管 PC 有 8 个逻辑核心,但 Visual Studio 2010 中的构建系统在使用 C# 时,仍然只使用一个核心!(**注意**:C++ 构建系统并非如此。)
所以在浏览网页后,我找到了如何手动触发 **msbuild** 作为 Visual Studio 外部工具,以并行编译您的解决方案。
有关如何设置此功能的更多详细信息,请参见 Scott Hanselman 的以下帖子:http://www.hanselman.com/blog/HackParallelMSBuildsFromWithinTheVisualStudioIDE.aspx
设置完成后,我得到了大约 10.2 分钟的构建时间。 对于几分钟的工作来说还不错! 此外,还从我的 CPU 中获得了以下精美图像,您可以在其中真正看到它们在工作
步骤 2:小心“复制本地 = True”
在我们的 100 个项目的解决方案中,许多项目相互引用,这是显而易见的。 除了这些引用之外,我们还引用了几个第三方组件,实际上来自每个模块。
以上所有这些导致我们每次编译解决方案时,会**写入超过 4.5 GB** 的文件。 大部分 (95%) 的写入都是 DLL,它们被复制到每个项目的输出文件夹中。
要检查编译中完成了多少次写入,请查看这篇帖子。
无论如何,即使在 SSD 驱动器上,4.5 GB 也需要很长时间才能写入。
因此,下一步是消除这些写入。 为此,我们将所有引用 DLL 中几乎所有的“**复制本地**”设置从默认的 **True** 更改为 **False**。 这将阻止引用的 DLL 被复制到每个项目的输出文件夹中。
**注意**:某些文件名已被涂黑以保护客户的财产。
此外,我们还将所有项目的输出文件夹更改为单个文件夹,因此所有生成的 DLL 都被复制到我们实际运行它们的唯一位置。 这样做会将编译时的写入减少到 200 MB 以下,从而节省了大量时间。 具体来说,构建时间缩短到 7.5 分钟!
步骤 3:使用 RAM 磁盘
RAM 磁盘是完全驻留在 RAM 上的逻辑磁盘。
它非常快(比任何 SSD 都快),但每次断电时都会被擦除,因此仅将其用于临时文件。
当然,您应该有足够的 RAM 来容纳这个磁盘(内存仅预先分配用于磁盘使用),但在 8GB PC 上,这通常不是问题。
您可以使用多个程序来设置 RAM 磁盘。 我使用了 DataRam RamDisk,它提供了一个免费版本,能够创建高达 4 GB 的 RAM 磁盘(1 或 2 GB 应该足以进行任何构建)。
RAM 磁盘的配置非常简单
下载、安装和格式化新的 RAM 磁盘后,您可以将单个输出文件夹移动到其中。 如果您希望将输出文件夹保留在同一构建驱动器中,则只需在当前输出文件夹和 RAM 磁盘上的文件夹之间创建符号链接即可。 这样可以使 RAM 磁盘的使用成为可选,仅适用于具有足够内存的用户。
要在构建文件夹和新的 RAM 磁盘文件夹之间创建符号链接,请使用以下行
mklink /D C:\Dev\MyCurrnetBuildFolder\Source\bin R:\bin
其中 *R:* 是您的 RAM 磁盘文件夹。
**注意**:您应该根据您的构建文件夹和 RAM 驱动器设置更改路径。
**结果**:添加 RAM 磁盘将编译时间减少到 5 分钟以下! 这是原始时间的 66% 缩减!
摘要
在本文中,我们已经看到了如何缩短构建时间。 当然,我不能做出任何保证。 每个项目都有自己的特点和问题,但如果您符合标准业务应用程序的概况,则提供的步骤可能会缩短构建时间。
暂时就到这里,
Arik Poznanski。