【发布时间】:2016-11-08 12:05:08
【问题描述】:
几年来,我们一直在使用 scons 作为构建系统来开发我们的项目。 Scons 很棒,极大地改进了我们的开发过程。 最初有大约 15000 个 C++ 源文件,随着项目的发展,其他语言(Java/Scala)的源文件也被添加到代码库中。 然后我们开发了自己的构建器来管理依赖关系并调用外部工具(javac,scalac)来构建这些源,效果非常好。 最近在做当前构建系统的优化,发现C++和Java构建过程的性能差异:
环境设置:
构建具有 24 核、Python 2.7.3、Scons 2.2.0 的服务器
命令: scons --duplicate=soft-copy -j8
在构建 java 代码时,从顶部很容易观察到 CPU 使用率很高并且跨越多个内核: Java Build
但是,在构建 C++ 代码时,CPU 使用率始终约为 4%,并且仅在 1 个核心上运行无论 scons 中有多少作业: C++ Build
我在互联网上搜索了很多,但找不到有用的东西。我在 Python 中遇到 GIL 问题了吗?我相信每个 gcc/g++ 命令都应该像我们自己的构建器中的 javac 一样在单独的子进程中运行,所以这里不应该有 GIL。是否有任何解决方法可以充分利用多个内核来进一步加速 C++ 构建? 提前致谢。
【问题讨论】:
-
您可能需要设置
-j标志:stackoverflow.com/questions/414714/… -
您对 C++ 部分(头文件和库)的隐式依赖是否可能根本不允许进一步并行化构建步骤? SCons 本身对于较大的构建或并行处理应该没有任何问题(参见例如Why SCons Is Not Slow),并且它的 CPU 测量值在您的屏幕截图中显示完整 100%。 SCons 可能正在闲置,试图找到新的任务来生成,但当前的依赖项禁止这样做。其他大型项目(如 MongoDB)在这方面似乎没有问题.... ;)
-
@dirkbaechle 感谢您的回复,这是一个合理的猜测,DAG 的宽度最多为 N(N 仅在 1 个核心上....相比之下,Java 构建在多个核心上大量运行。
-
@dirkbaechle 我们编写了自己的工具来在工作空间的根目录中生成单个 SConstruct(~50MB)。这是一个可能的原因吗?我将作业编号增加到 12,但构建时间仍然相同。当我单独构建 Java/Scala 代码时,更高的作业数量确实会减少构建时间。
-
当您说“构建”时,我们指的是“从头开始构建”还是“没有更改的增量构建”(空构建)?