Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用SSD加快编译速度 我想加快我的C++项目的编译时间。他们有大约300万行代码_C++_Visual Studio 2010_Compilation_Solid State Drive - Fatal编程技术网

使用SSD加快编译速度 我想加快我的C++项目的编译时间。他们有大约300万行代码

使用SSD加快编译速度 我想加快我的C++项目的编译时间。他们有大约300万行代码,c++,visual-studio-2010,compilation,solid-state-drive,C++,Visual Studio 2010,Compilation,Solid State Drive,当然,我不需要总是编译每个项目,但有时会有很多源文件被其他人修改,我需要重新编译所有这些文件(例如,当有人更新源文件时) 我估计编译一个mid项目(不涉及所有源文件)大约需要三分钟。我知道这不算太多,但有时候等待编译真的很无聊 我曾尝试将源代码移动到SSD(一种旧的OCZ Vertex 3 60GB)上,经过基准测试,它的速度是HDD的5到60倍(特别是在随机读/写方面)。无论如何,编译时间几乎相同(可能快2-3秒,但这应该是一个机会) 也许将VisualStudio存储箱移动到SSD会增加性能

当然,我不需要总是编译每个项目,但有时会有很多源文件被其他人修改,我需要重新编译所有这些文件(例如,当有人更新源文件时)

我估计编译一个mid项目(不涉及所有源文件)大约需要三分钟。我知道这不算太多,但有时候等待编译真的很无聊

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

也许将VisualStudio存储箱移动到SSD会增加性能


只想回答这个问题:我有一个W3520 Xeon@2.67 GHz和12GB的DDR3 ECC。

C++编译/链接受处理速度的限制,而不是HDD I/O。这就是为什么编译速度没有任何提高的原因。 (将编译器/链接器二进制文件移动到SSD将不起任何作用。编译大型项目时,编译器/链接器和必要的库将被读取到内存中一次并保留在内存中。)


< >我在编译C项目时看到一些工作目录移动到SSD或RAMDIST(这比C++模板中大量使用模板等耗费的时间要少很多),但还不够使它值得。

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

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

影响构建时间的因素很多,包括CPU与I/O“界限”的比率。根据我的经验(在Linux上),它们包括:

  • 代码的复杂性。大量的元模板使其占用更多的CPU时间,更多类似C的代码可能使生成对象的I/O(更)占主导地位
  • 临时文件的编译器设置,如GCC的
    -pipe
  • 正在使用优化。通常,选择越多,CPU的工作就越占主导地位
  • 并行构建。一次编译一个文件可能永远不会产生足够的I/O,以使当今最慢的硬盘达到任何极限。但是,一次编译8个内核(或更多)可能会导致错误
  • 正在使用的操作系统/文件系统。似乎过去的一些文件系统已经阻塞了许多并行构建的文件的访问模式,本质上是将I/O瓶颈放入文件系统代码中,而不是底层硬件中
  • 用于缓冲的可用RAM。操作系统缓冲I/O的力度越大,硬盘速度就越不重要。这就是为什么有时候一个
    make-j6
    会比一个
    make-j4
    慢,尽管有足够的空闲内核

简而言之:这取决于是否有足够的东西来做出任何“是的,它会帮助你”或“不是的,它会帮助你”纯粹的猜测,所以如果你有可能尝试一下,就去做吧。但是不要在上面花费太多时间,因为每一个小时你都会试图将编译时间减半,试着估算一下你(或者你的同事,如果你有的话)重建项目的频率,我发现,当代码在SSD(系统中有八个核心,12GB RAM)上时,编译一个大约100万行C++的项目大约增加了两倍。实际上,我们获得的最佳性能是一个SSD用于系统,另一个SSD用于源系统——这并不是说构建速度快得多,而是在进行大型构建时,操作系统的响应速度快得多

另一件产生巨大变化的事情是支持并行构建。请注意,有两个单独的选项都需要启用:

  • 菜单工具→ 选择权→ 项目和解决方案→ 并行项目生成的最大数量
  • 项目属性→ C++/General→ 多处理器编译

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

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

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

执行以下步骤以提高编译速度

  • 关闭休眠:命令提示符中的“powercfg-h off”

  • 关闭C驱动器上的驱动器索引

  • 将页面文件缩小到800 min/1024 max(最初设置为系统管理大小8092)


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

    您可能会感兴趣。Joel总结道,这并没有真正的帮助。将所有与includer无关的内容从头文件移到实现文件。将代码中的#include指令,尤其是头文件中的指令减少到最低限度。这通常会使意大利面项目的构建时间加快一个数量级以上。@BoBTFish:应该注意,这篇文章有点陈旧(SSD现在是3代b)