【问题标题】:What are the benefits of compiling with -j1 instead of -jN用 -j1 而不是 -jN 编译有什么好处
【发布时间】:2015-05-29 08:48:53
【问题描述】:

使用-jN 编译会更快,因为它同时编译多个部分。但是 GCC 文档说(虽然我找不到确切的链接)使用 -j1 编译会产生更好的优化二进制文件。

您能解释一下使用-j1 编译的所有好处吗?您能否提供一个小型 POC 来证明使用 -j1 编译生成比 -jN 更优化(在性能方面)的二进制文件?

【问题讨论】:

  • 我想获得该声明的链接。
  • 如果我不得不推测,我会说多线程编译可能不会对在不同线程中编译的代码块应用程序间优化。
  • 您可能正在考虑整个程序优化。当 gcc 只看到 1 个文件时,它仅限于它可以优化的内容,因为未知的外部代码可能取决于行为。如果 gcc 看到整个程序,它可以准确地确定哪些代码取决于什么,从而可以进行更好的优化。使用 -j1 让 gcc 一次编译一个文件或使用 -jN 来同时编译所有文件都没有区别。但是,是让一个实例通过一次调用编译所有内容,还是让每个文件分别通过单独调用编译,这确实有所不同。
  • @nwp 是的,我在说这个,我只是不知道如何表达。谢谢!您能否为我指出更多文档或在答案中进一步详细说明以便我接受?

标签: c++ c gcc


【解决方案1】:

-j 选项用于制作。 gcc 没有这样的选项

我认为您在谈论 -O 选项。

这是 -O1 的手册页

   -O1 Optimize.  Optimizing compilation takes somewhat more time, and a lot more memory for a large function. 
   With -O, the compiler tries to reduce code size and execution time, without performing any optimizations that take a great deal of compilation time.

【讨论】:

  • -j 如您所说,是make 中的一个选项,它除了启动多个 GCC 实例之外什么也不做。恕我直言,我的问题是正确的:“GCC 的单个实例是否比 GCC 的多个实例产生更好的优化二进制文件”。
  • 请问您是从哪里得出这个结论的?
  • 我记得在 GCC 文档的某个地方读过它,但我现在找不到该文本(不过我正在尝试找到它)。
【解决方案2】:

您可能正在考虑整个程序优化。当 gcc 只看到 1 个文件时,它仅限于它可以优化的内容,因为未知的外部代码可能取决于行为,因此很难完全优化。如果 gcc 看到整个程序,它可以准确地确定哪些代码取决于什么,从而可以进行更好的优化。使用 -j1 让 gcc 一次编译一个文件或使用 -jN 来同时编译所有文件都没有区别。但是,让一个实例通过一次调用编译所有内容还是让每个文件分别通过单独调用编译所有文件确实有所不同。

参考:The compiler performs optimization based on the knowledge it has of the program. Compiling multiple files at once to a single output file mode allows the compiler to use information gained from all of the files when compiling each of them.

【讨论】:

    猜你喜欢
    • 2019-11-10
    • 2019-11-19
    • 2010-09-14
    • 2022-08-03
    • 1970-01-01
    • 2016-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多