Scons 在大型代码库中为 C++ 构建性能
Scons Build performance for C++ in large code base
几年来,我们一直致力于使用 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++ 构建?
提前致谢。
正如 WindLeeWT 在他的评论之一中所解释的那样,观察到的行为的原因是 ccache
在有问题的服务器上安装和配置。似乎 C++ 构建期间的大部分 CPU 用法都是在编译阶段使用的,由于 ccache
而完全避免了。这就是为什么在 top
.
中看不到几个内核的 CPU 使用情况
他们在没有 ccache
的情况下在另一台服务器上启动 "build from scratch" 后,几个核心 运行 达到 90%,'cc1plus -o ...' 正如预期的那样。
没有涉及性能损失(GIL 等),Python 和 SCons 都没有以任何显着方式降低性能。
几年来,我们一直致力于使用 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++ 构建? 提前致谢。
正如 WindLeeWT 在他的评论之一中所解释的那样,观察到的行为的原因是 ccache
在有问题的服务器上安装和配置。似乎 C++ 构建期间的大部分 CPU 用法都是在编译阶段使用的,由于 ccache
而完全避免了。这就是为什么在 top
.
他们在没有 ccache
的情况下在另一台服务器上启动 "build from scratch" 后,几个核心 运行 达到 90%,'cc1plus -o ...' 正如预期的那样。
没有涉及性能损失(GIL 等),Python 和 SCons 都没有以任何显着方式降低性能。