Performance 克隆窃取启动时间

Performance 克隆窃取启动时间,performance,build,environment,scons,Performance,Build,Environment,Scons,我们已经完成了将大型GNU Make-build系统转换为SCON的工作 除了在Environment.Clone()中花费7秒的启动时间外,其他一切都运行得很好。我们使用的是Clone(),因为它具有不修改现有全局状态的良好功能风格 是否有人想出了一种方法,可以不复制环境中99%的数据在克隆中永远不会更改 在字典中删除未使用的密钥可以改进克隆()/时间> /p> ,根据您的注释,可以考虑将您的构建划分为几个较小的构建,每个控件由其单独的SeaScript构建脚本控制,同时保持完整构建的当前构造

我们已经完成了将大型GNU Make-build系统转换为SCON的工作

除了在
Environment.Clone()
中花费7秒的启动时间外,其他一切都运行得很好。我们使用的是
Clone()
,因为它具有不修改现有全局状态的良好功能风格

是否有人想出了一种方法,可以复制
环境中99%的
数据
克隆中永远不会更改


在字典中删除未使用的密钥可以改进<代码>克隆()/<代码>时间> /p> ,根据您的注释,可以考虑将您的构建划分为几个较小的构建,每个控件由其单独的SeaScript构建脚本控制,同时保持完整构建的当前构造。我可以想象,一个开发人员改变C++代码只需要一次就完成完整的项目来获得非C++依赖。然后,在处理C++特性时,他/她只需要构建C++。ada和fortran也是如此

例如,假设您有类似于以下目录结构的内容:

root_dir
|
+--- src_ada
|
+--- src_cpp
|
+--- src_fortran
对于每种类型的生成,您都可以有一个根级别的SConstruct,如下所示:

SConstruct             # performs a complete build
SConstruct.ada         # builds just the ada
SConstruct.cpp         # builds just the cpp
SConstruct.fortran     # builds just the fortran
如果正确创建了这些SConstruct脚本,则可能不需要修改子SConscript构建脚本

您甚至可以更进一步,创建一个构建包装器脚本,该脚本可以采用以下命令行参数:

build [complete (default arg) | ada | cpp | fortran]
在内部,脚本将使用适当的SConstruct调用scon,可以是以下内容之一:

scons -f SConstruct
scons -f SConstruct.ada
scons -f SConstruct.cpp
scons -f SConstruct.fortran

请注意,选项
-f file,--file=file,--makefile=file,--sconstruct=file
的作用都是相同的:让您指定要用于生成的sconstruct,如中所述。

另一个选项是具有多个不同的环境对象,这些对象将传递给不同的子SConscript构建脚本。您可以拥有一个通用生成设置,该设置适用于不需要克隆的所有子SConscript脚本,然后是不同编程语言的不同环境对象,这些对象将根据其中的需要选择性地传递给子SConscript脚本。这些更具体的环境对象可能需要克隆


像这样分离环境对象可以加快克隆速度,因为只克隆特定子脚本所需的信息。

项目有多大?有多少个源文件?项目由大约150个单独的组件(CI)组成,每个组件都有自己的SConscript和env.Clone()。修正了一个bug后,我把这个数字修改为7秒。在C、C++、FORTRAN和艾达中大约有2-3个源文件。和以前的制作系统相比,整个构建时间是多少?您可以执行以下命令来查看时间概览:scons--debug=time…构建时间正常。我们最大的问题是NFS解决方案速度慢,而且我们的代码大部分都在Ada中。我已经对scons ada builder进行了大量修改,现在可以完全工作了。我们正在使用Ada泛型子包等的所有功能。需要优化的是小型(部分构建)的启动时间。因此,这是一个问题。