配置文件提供了一种改变编译器设置的方法,从而影响优化和调试符号等内容。
Cargo有4个内置配置文件:dev
, release
, test
和bench
。如果未在命令行上指定配置文件,则会根据正在运行的命令自动选择配置文件。除了内置配置文件外,还可以指定自定义用户定义的配置文件。
配置文件设置可以在中更改Cargo.toml
和[profile]
桌子在每个命名的配置文件中,可以使用如下键/值对更改各个设置:
[profile.dev]
opt-level = 1 # Use slightly better optimizations.
overflow-checks = false # Disable integer overflow checks.
Cargo只查看Cargo.toml
在工作区的根目录下显示。依赖项中定义的配置文件设置将被忽略。
此外,配置文件可以从config释义在配置文件或环境变量中指定配置文件将覆盖Cargo.toml
.
以下是可在配置文件中控制的设置列表。
这个opt-level
设置控制-C opt-level
flag它控制着优化的水平。更高的优化级别可能会以更长的编译时间为代价生成更快的运行时代码。更高级别也可能会更改和重新排列编译后的代码,这可能会使其更难与调试器一起使用。
有效选项包括:
0
:没有优化1
:基本优化2
:一些优化3
:所有优化"s"
:优化二进制大小"z"
:优化二进制大小,但也关闭循环矢量化。
建议尝试不同的级别,为项目找到合适的平衡点。可能会有令人惊讶的结果,比如3
慢于2
,或"s"
和"z"
水平不一定更小。随着时间的推移,您可能还希望重新评估您的设置,使其成为新版本的rustc
改变优化行为。
另见Profile Guided Optimization获取更高级的优化技术。
这个debug
设置控制-C debuginfo
flag它控制编译的二进制文件中包含的调试信息量。
有效选项包括:
0
或false
:完全没有调试信息1
:仅限行表2
或true
:完整调试信息
您可能还希望配置split-debuginfo
根据您的需要选择。
这个split-debuginfo
设置控制-C split-debuginfo
flag它控制调试信息(如果生成)是放在可执行文件本身还是与之相邻。
此选项是一个字符串,可接受的值与compiler accepts。此选项的默认值为unpacked
在macOS上,用于启用调试信息的配置文件。否则,此选项的默认值为documented with rustc而且是特定于平台的。有些选项仅在nightly channel.一旦再次进行测试,并且对DWARF的支持稳定,Cargo默认值可能会在未来发生变化。
这个debug-assertions
设置控制-C debug-assertions
flag哪个转弯cfg(debug_assertions)
conditional compilation开或关。调试断言旨在包括仅在调试/开发版本中可用的运行时验证。在发布版本中,这些可能过于昂贵或不受欢迎。调试断言支持debug_assert!
macro在标准库中。
有效选项包括:
true
:启用false
:禁用
这个overflow-checks
设置控制-C overflow-checks
flag它控制着runtime integer overflow。当启用溢出检查时,溢出将发生死机。
有效选项包括:
true
:启用false
:禁用
这个lto
设置控制-C lto
flag控制LLVM的link
time optimizations.LTO可以使用整个程序分析,以更长的链接时间为代价,生成更好的优化代码。
有效选项包括:
false
:执行“精简本地LTO”,仅在本地箱子上的所有箱子上执行“精简”LTOcodegen units.如果codegen单位为1或1,则不执行LTOopt-level是0。true
或"fat"
:执行“fat”LTO,尝试对依赖关系图中的所有箱子执行优化。"thin"
:表演"thin" LTO。这与“fat”类似,但运行时间大大缩短,同时仍能获得类似于“fat”的性能提升。"off"
:禁用LTO。
另见-C linker-plugin-lto
rustc
跨语言LTO的标志。
这个panic
设置控制-C panic
flag它控制着使用哪种恐慌策略。
有效选项包括:
"unwind"
:惊慌失措时,松开堆叠。"abort"
:恐慌时终止进程。
当设置为"unwind"
,实际值取决于目标平台的默认值。例如,NVPTX平台不支持退绕,所以它总是使用"abort"
.
测试、基准测试、构建脚本和过程宏忽略了panic
背景这个rustc
测试线束目前需要unwind
行为看到了吗panic-abort-tests
不稳定的标志,使abort
行为
此外,当使用abort
策略和构建测试时,所有依赖项也将被迫与unwind
策略
这个incremental
设置控制-C incremental
flag它控制是否启用增量编译。增量编译原因rustc
将其他信息保存到磁盘,以便在重新编译箱子时重复使用,从而缩短重新编译时间。附加信息存储在target
目录
有效选项包括:
true
:启用false
:禁用
增量编译仅用于工作区成员和“路径”依赖项。
增量值可以用CARGO_INCREMENTAL
environment variable或者build.incremental
配置变量。
这个codegen-units
设置控制-C codegen-units
flag控制一个箱子将被分成多少个“代码生成单元”。更多的代码生成单元允许并行处理更多的箱子,这可能会减少编译时间,但可能会生成较慢的代码。
此选项接受大于0的整数。
默认值为256incremental构建,16个用于非增量构建。
这个rpath
设置控制-C rpath
flag它控制着是否rpath
已启用。
这个dev
配置文件用于正常的开发和调试。这是构建命令的默认设置,如cargo build
.
默认设置为dev
个人资料包括:
[profile.dev]
opt-level = 0
debug = true
split-debuginfo = '...' # Platform-specific.
debug-assertions = true
overflow-checks = true
lto = false
panic = 'unwind'
incremental = true
codegen-units = 256
rpath = false
这个release
概要文件旨在用于发布和生产中使用的优化工件。当--release
将使用标志,并且是的默认值cargo install
.
默认设置为release
个人资料包括:
[profile.release]
opt-level = 3
debug = false
split-debuginfo = '...' # Platform-specific.
debug-assertions = false
overflow-checks = false
lto = false
panic = 'unwind'
incremental = false
codegen-units = 16
rpath = false
这个test
profile是用户使用的默认配置文件cargo test
这个test
配置文件从dev
轮廓
这个bench
profile是用户使用的默认配置文件cargo bench
这个bench
配置文件从release
轮廓
默认情况下,所有配置文件都不会优化生成依赖项(生成脚本、过程宏及其依赖项)。生成替代的默认设置为:
[profile.dev.build-override]
opt-level = 0
codegen-units = 256
[profile.release.build-override]
opt-level = 0
codegen-units = 256
生成依赖项以其他方式继承正在使用的活动配置文件中的设置,如中所述Profile selection.
除了内置配置文件外,还可以定义其他自定义配置文件。这些对于设置多个工作流和构建模式可能很有用。定义自定义配置文件时,必须指定inherits
键指定未指定设置时自定义配置文件从哪个配置文件继承设置。
例如,假设您想要比较一个普通的发布版本和一个具有LTO在优化中,可以指定如下内容:Cargo.toml
:
[profile.release-lto]
inherits = "release"
lto = true
这个--profile
然后可以使用标志选择此自定义配置文件:
cargo build --profile release-lto
每个概要文件的输出将被放置在与中的概要文件同名的目录中target
directory.如上例所示,输出将进入target/release-lto
目录
使用的配置文件取决于命令,命令行标志如--release
或--profile
,以及包(如果是overrides)。如果未指定任何配置文件,则默认配置文件为:
命令 | 默认配置文件 |
---|---|
cargo run , cargo build ,cargo check , cargo rustc |
dev profile |
cargo test |
test profile |
cargo bench |
bench profile |
cargo install |
release profile |
您可以使用--profile=NAME
将使用给定配置文件的选项。这个--release
国旗相当于--profile=release
.
所选配置文件适用于所有Cargo目标,包括library, binary, example, test和benchmark.
可以使用指定特定包的配置文件overrides,如下所述。
可以覆盖特定软件包和构建时箱子的配置文件设置。要覆盖特定软件包的设置,请使用package
表更改命名包的设置:
# The `foo` package will use the -Copt-level=3 flag.
[profile.dev.package.foo]
opt-level = 3
包名实际上是一个Package ID Spec,因此您可以使用以下语法将包的各个版本作为目标:[profile.dev.package."foo:2.1.0"]
.
要覆盖所有依赖项(但不是任何工作区成员)的设置,请使用"*"
软件包名称:
# Set the default for dependencies.
[profile.dev.package."*"]
opt-level = 2
要覆盖生成脚本、过程宏及其依赖项的设置,请使用build-override
表:
# Set the settings for build scripts and proc-macros.
[profile.dev.build-override]
opt-level = 3
注意:当一个依赖项既是普通依赖项又是构建依赖项时,Cargo将在以下情况下尝试只构建一次
--target
未指定。使用时build-override
,依赖项可能需要生成两次,一次作为正常依赖项,一次使用重写的生成设置。这可能会增加初始构建时间。
使用值的优先顺序如下(第一场比赛获胜):
[profile.dev.package.name]
-一个命名的包。[profile.dev.package."*"]
-对于任何非工作区成员。[profile.dev.build-override]
-仅适用于生成脚本、过程宏及其依赖项。[profile.dev]
-设置在Cargo.toml
.- Cargo中内置的默认值。
覆盖不能指定panic
, lto
或rpath
设置。
实例化泛型代码的位置将影响用于该泛型代码的优化设置。当使用配置文件覆盖更改特定箱子的优化级别时,这可能会导致微妙的交互。如果试图提高定义泛型函数的依赖项的优化级别,则在本地箱子中使用这些泛型函数时可能无法进行优化。这是因为代码可能会在实例化的箱子中生成,因此可能会使用该箱子的优化设置。
例如nalgebra是一个定义向量和矩阵的库,大量使用通用参数。如果您的本地代码定义了具体的nalgebra类型,比如Vector4<f64>
并使用他们的方法,相应的nalgebra代码将被实例化并构建在您的箱子中。因此,如果您试图提高nalgebra
使用配置文件覆盖可能不会带来更快的性能。
使问题进一步复杂化,rustc
有一些优化,它将尝试在箱子之间共享单晶仿制药。如果opt级别为2或3,则箱子将不会使用其他箱子中的单形态仿制药,也不会出口本地定义的单形态产品与其他箱子共享。当尝试优化依赖关系来开发时,请考虑尝试OPT级1,它将应用一些优化,同时仍允许共享单态化项。