Skip to content

Latest commit

 

History

History
344 lines (211 loc) · 14.1 KB

profiles.zh.md

File metadata and controls

344 lines (211 loc) · 14.1 KB

Profiles

配置文件提供了一种改变编译器设置的方法,从而影响优化和调试符号等内容。

Cargo有4个内置配置文件:dev, release, testbench。如果未在命令行上指定配置文件,则会根据正在运行的命令自动选择配置文件。除了内置配置文件外,还可以指定自定义用户定义的配置文件。

配置文件设置可以在中更改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.

Profile settings

以下是可在配置文件中控制的设置列表。

opt-level

这个opt-level设置控制-C opt-level flag它控制着优化的水平。更高的优化级别可能会以更长的编译时间为代价生成更快的运行时代码。更高级别也可能会更改和重新排列编译后的代码,这可能会使其更难与调试器一起使用。

有效选项包括:

  • 0:没有优化
  • 1:基本优化
  • 2:一些优化
  • 3:所有优化
  • "s":优化二进制大小
  • "z":优化二进制大小,但也关闭循环矢量化。

建议尝试不同的级别,为项目找到合适的平衡点。可能会有令人惊讶的结果,比如3慢于2,或"s""z"水平不一定更小。随着时间的推移,您可能还希望重新评估您的设置,使其成为新版本的rustc改变优化行为。

另见Profile Guided Optimization获取更高级的优化技术。

debug

这个debug设置控制-C debuginfo flag它控制编译的二进制文件中包含的调试信息量。

有效选项包括:

  • 0false:完全没有调试信息
  • 1:仅限行表
  • 2true:完整调试信息

您可能还希望配置split-debuginfo根据您的需要选择。

split-debuginfo

这个split-debuginfo设置控制-C split-debuginfo flag它控制调试信息(如果生成)是放在可执行文件本身还是与之相邻。

此选项是一个字符串,可接受的值与compiler accepts。此选项的默认值为unpacked在macOS上,用于启用调试信息的配置文件。否则,此选项的默认值为documented with rustc而且是特定于平台的。有些选项仅在nightly channel.一旦再次进行测试,并且对DWARF的支持稳定,Cargo默认值可能会在未来发生变化。

debug-assertions

这个debug-assertions设置控制-C debug-assertions flag哪个转弯cfg(debug_assertions) conditional compilation开或关。调试断言旨在包括仅在调试/开发版本中可用的运行时验证。在发布版本中,这些可能过于昂贵或不受欢迎。调试断言支持debug_assert! macro在标准库中。

有效选项包括:

  • true:启用
  • false:禁用

overflow-checks

这个overflow-checks设置控制-C overflow-checks flag它控制着runtime integer overflow。当启用溢出检查时,溢出将发生死机。

有效选项包括:

  • true:启用
  • false:禁用

lto

这个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

这个panic设置控制-C panic flag它控制着使用哪种恐慌策略。

有效选项包括:

  • "unwind":惊慌失措时,松开堆叠。
  • "abort":恐慌时终止进程。

当设置为"unwind",实际值取决于目标平台的默认值。例如,NVPTX平台不支持退绕,所以它总是使用"abort".

测试、基准测试、构建脚本和过程宏忽略了panic背景这个rustc测试线束目前需要unwind行为看到了吗panic-abort-tests不稳定的标志,使abort行为

此外,当使用abort策略和构建测试时,所有依赖项也将被迫与unwind策略

incremental

这个incremental设置控制-C incremental flag它控制是否启用增量编译。增量编译原因rustc将其他信息保存到磁盘,以便在重新编译箱子时重复使用,从而缩短重新编译时间。附加信息存储在target目录

有效选项包括:

  • true:启用
  • false:禁用

增量编译仅用于工作区成员和“路径”依赖项。

增量值可以用CARGO_INCREMENTAL environment variable或者build.incremental配置变量。

codegen-units

这个codegen-units设置控制-C codegen-units flag控制一个箱子将被分成多少个“代码生成单元”。更多的代码生成单元允许并行处理更多的箱子,这可能会减少编译时间,但可能会生成较慢的代码。

此选项接受大于0的整数。

默认值为256incremental构建,16个用于非增量构建。

rpath

这个rpath设置控制-C rpath flag它控制着是否rpath已启用。

Default profiles

dev

这个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概要文件旨在用于发布和生产中使用的优化工件。当--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

这个testprofile是用户使用的默认配置文件cargo test这个test配置文件从dev轮廓

bench

这个benchprofile是用户使用的默认配置文件cargo bench这个bench配置文件从release轮廓

Build Dependencies

默认情况下,所有配置文件都不会优化生成依赖项(生成脚本、过程宏及其依赖项)。生成替代的默认设置为:

[profile.dev.build-override]
opt-level = 0
codegen-units = 256

[profile.release.build-override]
opt-level = 0
codegen-units = 256

生成依赖项以其他方式继承正在使用的活动配置文件中的设置,如中所述Profile selection.

Custom profiles

除了内置配置文件外,还可以定义其他自定义配置文件。这些对于设置多个工作流和构建模式可能很有用。定义自定义配置文件时,必须指定inherits键指定未指定设置时自定义配置文件从哪个配置文件继承设置。

例如,假设您想要比较一个普通的发布版本和一个具有LTO在优化中,可以指定如下内容:Cargo.toml:

[profile.release-lto]
inherits = "release"
lto = true

这个--profile然后可以使用标志选择此自定义配置文件:

cargo build --profile release-lto

每个概要文件的输出将被放置在与中的概要文件同名的目录中target directory.如上例所示,输出将进入target/release-lto目录

Profile selection

使用的配置文件取决于命令,命令行标志如--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, testbenchmark.

可以使用指定特定包的配置文件overrides,如下所述。

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,依赖项可能需要生成两次,一次作为正常依赖项,一次使用重写的生成设置。这可能会增加初始构建时间。

使用值的优先顺序如下(第一场比赛获胜):

  1. [profile.dev.package.name]-一个命名的包。
  2. [profile.dev.package."*"]-对于任何非工作区成员。
  3. [profile.dev.build-override]-仅适用于生成脚本、过程宏及其依赖项。
  4. [profile.dev]-设置在Cargo.toml.
  5. Cargo中内置的默认值。

覆盖不能指定panic, ltorpath设置。

Overrides and generics

实例化泛型代码的位置将影响用于该泛型代码的优化设置。当使用配置文件覆盖更改特定箱子的优化级别时,这可能会导致微妙的交互。如果试图提高定义泛型函数的依赖项的优化级别,则在本地箱子中使用这些泛型函数时可能无法进行优化。这是因为代码可能会在实例化的箱子中生成,因此可能会使用该箱子的优化设置。

例如nalgebra是一个定义向量和矩阵的库,大量使用通用参数。如果您的本地代码定义了具体的nalgebra类型,比如Vector4<f64>并使用他们的方法,相应的nalgebra代码将被实例化并构建在您的箱子中。因此,如果您试图提高nalgebra使用配置文件覆盖可能不会带来更快的性能。

使问题进一步复杂化,rustc有一些优化,它将尝试在箱子之间共享单晶仿制药。如果opt级别为2或3,则箱子将不会使用其他箱子中的单形态仿制药,也不会出口本地定义的单形态产品与其他箱子共享。当尝试优化依赖关系来开发时,请考虑尝试OPT级1,它将应用一些优化,同时仍允许共享单态化项。