加快编译时间与SSD

Speed up compile time with SSD

本文关键字:SSD 时间 编译      更新时间:2023-10-16

我想尝试加快我们c++项目的编译时间。他们有大约3M行代码。

当然,我不需要总是编译每个项目,但有时有很多被其他人修改的源文件,我需要重新编译它们(例如,当有人更新ASN.1源文件时)。

我已经测量过,编译一个中期项目(不涉及所有源文件)大约需要三分钟。我知道这并不是太多,但是有时候等待编译真的很无聊。

我试图将源代码移动到SSD(旧的OCZ Vertex 3 60 GB),基准测试,它比HDD快5到60倍(特别是在随机读取/写入时)。无论如何,编译时间几乎是相同的(可能快2-3秒,但这应该是一个机会)。

也许将Visual Studio bin移动到SSD会获得额外的性能增量?

只是为了完成这个问题:我有一个W3520 Xeon @2.67 GHz和12 GB的DDR3 ECC。

这在很大程度上取决于您的构建环境和其他设置。例如,在我的主编译服务器上,我有96 GiB的RAM和16个内核。硬盘很慢,但这并不重要,因为所有内容都缓存在RAM中。

在我的桌面上(我有时也在那里编译),我只有8gb的RAM和6个内核。在那里进行同样的并行构建可以大大加快速度,因为六个并行运行的编译器消耗了足够的内存,SSD速度差异非常明显。

影响构建时间的因素有很多,包括CPU与I/O"边界"的比率。根据我的经验(Linux上的GCC),它们包括:
    代码的复杂度。大量的元模板使它使用更多的CPU时间,更多的c类代码可能使生成对象的I/O(更多)占主导地位
  • 临时文件的编译器设置,如GCC的-pipe
  • 正在使用优化。通常,优化得越多,CPU工作占主导地位就越大。
  • 并行构建。一次编译一个文件可能永远不会产生足够的I/O,使当今最慢的硬盘达到任何极限。然而,一次使用8个内核(或更多)编译可能会。
  • 正在使用的操作系统/文件系统。过去的一些文件系统似乎对并行构建的许多文件的访问模式感到阻塞,实际上将I/O瓶颈置于文件系统代码中,而不是底层硬件。
  • 用于缓冲的可用RAM。操作系统对I/O的缓冲能力越强,HDD的速度就越不重要。这就是为什么有时make -j6可以比make -j4慢,尽管有足够的空闲内核。

简而言之:它取决于足够多的事情来做出任何"是,它将帮助你"或"否,它将帮助你"纯粹的猜测,所以如果你有尝试的可能性,那就去做。但是不要在这上面花太多时间,每花一个小时,你就试着把编译时间减半,试着估计一下你(或者你的同事,如果你有的话)重建项目的频率,以及这与可能节省的时间有什么关系。

c++编译/链接受限于处理速度,而不是HDD I/O。这就是为什么编译速度没有任何提高。(将编译器/链接器二进制文件移动到SSD将没有任何作用。当你编译一个大项目时,编译器/链接器和必要的库被读入内存一次,并留在那里。

在编译C项目时,我看到将工作目录移动到SSD或ramdisk会有一些轻微的加速(这比大量使用模板的c++项目要少得多),但还不足以使其值得。

我发现编译一个大约有100万行c++的项目,当代码在SSD(具有8核corei7,12 GB RAM的系统)上时,速度大约是原来的两倍。实际上,我们获得的最佳性能是使用一个SSD作为系统,另一个SSD作为源代码——这并不是说构建更快,而是在进行大型构建时操作系统的响应速度更快。

另一件产生巨大差异的事情是允许并行构建。注意,有两个单独的选项都需要启用:

  • 菜单工具选项项目和解决方案→并行项目构建的最大数量
  • 项目属性→ c++/通用多处理器编译

多处理器编译与其他几个标志(包括最小重建,我认为)不兼容,所以检查输出窗口是否有警告。我发现设置了MP编译标志后,所有内核的负载都接近100%,因此您至少可以看到CPU正在被大量使用。

没有提到的一点是,当使用ccache和高度并行构建时,您将看到使用SSD的好处。

我确实用SSD替换了我的硬盘,希望它能减少我的c++项目的编译时间。简单地将硬盘驱动器替换为SSD并不能解决问题,两者的编译时间几乎相同。

然而,在最初的失败之后,我成功地将编译速度提高了大约六倍。

以下步骤是为了提高编译速度。

  1. 关闭休眠:"powercfg -h off"在命令提示符

  2. 关闭C盘索引

  3. 将页面文件缩小到800分钟/最大1024(最初设置为系统管理大小8092)。