使用 SSD 加快编译时间

2024-05-15

我想尝试加快 C++ 项目的编译时间。他们有大约 300 万行代码。

当然,我不需要总是编译每个项目,但有时有很多源文件被其他人修改过,我需要重新编译所有这些文件(例如,当有人更新一个项目时)ASN.1 https://en.wikipedia.org/wiki/Abstract_Syntax_Notation_One源文件)。

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

我尝试将源代码移至 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 个内核。 HDD 相当慢,但这并不重要,因为所有内容都缓存在 RAM 中。

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

有很多因素会影响构建时间,包括 CPU 与 I/O“边界”的比率。在我的经验中 (GCC http://en.wikipedia.org/wiki/GNU_Compiler_Collection在 Linux 上)它们包括:

  • 代码的复杂性。许多元模板使其使用更多的 CPU 时间,更多类似 C 的代码可能会使生成对象的 I/O(更多)占主导地位
  • 临时文件的编译器设置,例如-pipe对于海湾合作委员会。
  • 正在使用优化。通常,优化越多,CPU 工作就越占主导地位。
  • 并行构建。一次编译一个文件可能永远不会产生足够的 I/O 来使当今最慢的硬盘达到任何限制。然而,同时使用八个核心(或更多)进行编译可能会这样。
  • 正在使用的操作系统/文件系统。过去的一些文件系统似乎因并行构建的许多文件的访问模式而陷入困境,本质上将 I/O 瓶颈置于文件系统代码中,而不是底层硬件中。
  • 可用于缓冲的 RAM。操作系统缓冲 I/O 的能力越强,HDD 速度就越不重要。这就是为什么有时make -j6可能比 a 慢make -j4尽管有足够的空闲核心。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 SSD 加快编译时间 的相关文章

  • CMake 找不到请求的 Boost 库

    既然我已经浏览了其他人的解决方案几个小时 但找不到适合我的问题的正确答案 我想将我的具体问题带给您 我正在尝试使用 CMake 构建 vsomeip 为此 我之前构建了 boost 1 55 但是 我在 CMake 中收到以下错误 The
  • 为什么 F# 的默认集合是排序的,而 C# 的不是?

    当从 C 世界迁移到 F 最惯用的可能 思维方式时 我发现了这个有趣的差异 在 C 的 OOP mutable 世界中 默认的集合集合似乎是HashSet https learn microsoft com en us dotnet api
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • std::call_once 可重入且线程安全吗?

    std call once http en cppreference com w cpp thread call once是线程安全的 但它也是可重入的吗 我使用 VS2012 调试和发布 进行的测试表明 调用std call once从单
  • 使用 Visual Studio Express 2010 表单应用程序进行 C++ 多线程处理

    我正在开发一个 Windows 窗体应用程序 它连接到一个硬件 获取大量数据 1 GSample 秒 对其进行处理 然后单击按钮将其输出到屏幕上 我现在尝试在一个可以随时启动 停止的循环中自动化该过程 以便我可以在调整采集硬件的输入的同时对
  • 为什么'enable_if'不能用于禁用这里声明

    include
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • 获取 boost Spirit 语法中的当前行

    我正在尝试使用 boostspirit 获取正在解析的文件的当前行 我创建了一个语法类和结构来解析我的命令 我还想跟踪在哪一行找到命令并将其解析到我的结构中 我将 istream 文件迭代器包装在 multi pass 迭代器中 然后将其包
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 如何对 NServiceBus.Configure.WithWeb() 进行单元测试?

    我正在构建一个 WCF 服务 该服务接收外部 IP 上的请求并将其转换为通过 NServiceBus 发送的消息 我的单元测试之一调用Global Application Start 它执行应用程序的配置 然后尝试将 Web 服务解析为 验
  • 在 asp.net MVC 中使用活动目录进行身份验证

    我想使用活动目录对我的 asp net mvc 项目中的用户进行身份验证 在网上冲浪了几个小时后 我没有找到任何对我有用的东西 我已经看到了所有结果 但什么也没有 我尝试按照许多帖子的建议编辑我的 web config 如果有人可以帮助我提
  • 引用/指针失效到底是什么?

    我找不到任何定义指针 引用无效在标准中 我问这个问题是因为我刚刚发现 C 11 禁止字符串的写时复制 COW 据我了解 如果应用了 COW 那么p仍然是一个有效的指针并且r以下命令后的有效参考 std string s abc std st
  • 使用 GCC 生成可读的程序集?

    我想知道如何使用GCC http en wikipedia org wiki GNU Compiler Collection在我的 C 源文件中转储机器代码的助记符版本 这样我就可以看到我的代码被编译成什么 你可以使用 Java 来做到这一
  • 在 OpenGL 中渲染纹理 1 到 1

    所以我想做的是使用 OpenGL 和 C 将纹理渲染到平面上 作为显示图像的一种方式 但是我需要确保在渲染纹理时没有对纹理进行任何处理 抗锯齿 插值 平滑 模糊等 这是 OpenGL 处理渲染纹理的默认方式吗 或者是否需要设置一些标志才能禁
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • LINQ 中的“from..where”或“FirstOrDefault”

    传统上 当我尝试从数据库中获取用户的数据时 我使用了以下方法 在某种程度上 DbUsers curUser context DbUsers FirstOrDefault x gt x u LoginName id string name c
  • 来自 3rd 方库的链接器错误 LNK2019

    我正在将旧的 vc 6 0 应用程序移植到 vs2005 我收到以下链接器错误 我花了几天时间试图找到解决方案 错误LNK2019 无法解析的外部符号 imp 创建AwnService 52 在函数 public int thiscall
  • 结构化绑定的用例有哪些?

    C 17 标准引入了新的结构化绑定 http en cppreference com w cpp language structured binding功能 最初是proposed http www open std org jtc1 sc

随机推荐