make 命令中使用 $($(nproc) + 1) 的逻辑是什么?

skr*_*skr 3 cpu make jobs

我试图根据一些在线指南在 Ubuntu 中安装 OpenCV。就是其中一本指南。它有以下行:

make -j $(($(nproc) + 1))
Run Code Online (Sandbox Code Playgroud)

返回nproc系统上可用的处理器/线程的数量。那么,比现有的更高的有什么优势呢?

Ste*_*itt 8

大多数构建都受 I/O 限制,而不是 CPU 限制,因此虽然这nproc是一个不错的起点(另请参阅如何确定要传递给 make -j 选项的最大数量?),但大多数构建可以使用更多数量。如果您\xe2\x80\x99 使用小型虚拟机进行构建(您\xe2\x80\x99 经常在构建场中找到这种虚拟机),则尤其如此;在那里你\xe2\x80\x99d最终得到-j 1or -j 2,并且使用-j 2or-j 3通常会导致更短的构建时间,而没有与诸如$(nproc) * 2(即使在8线程系统上也可能导致问题,更不用说更大的线程)相关的公式的风险您在服务器上找到的计数)。

\n

  • 它们不依赖于“nproc”。这就是“$(nproc) + 1”的全部意义。从头开始,如果您在当前系统(甚至是已有 15 年历史的系统)上运行线性构建,您的 CPU 大部分时间都会处于空闲状态;所以你想增加并行运行的作业数量。然而,构建时间的真正限制不是 CPU 容量,而是 I/O 容量,但没有方便的指标来确定这一点。所以 `nproc` 是一个代理:它告诉你可以并行运行多少个作业,至少不会耗尽你的 CPU 资源。添加一个是使用更多 CPU 的常见技术...... (2认同)