Optimization options
!! Page WIP !!
Build options can be specified as the environment variable
export RUSTFLAGS="-C option1=value1 -C option2=value2"
before running cargo build
.
Another possibility is to collect all options in a custom profile that is specified in the Cargo.toml
file at the root of the polkadot directory. In the polkadot source, there are already two such profiles:
[profile.release]
# Polkadot runtime requires unwinding.
panic = "unwind"
opt-level = 3
[profile.production]
inherits = "release"
lto = true
codegen-units = 1
As explained below, the production profile includes more advanced optimization options.
The maximum number of code generation units a crate can be split into. Standard value is 16. Choosing 1 may improve the performance of generated code.
In our testing, codegen=True
means -C codegen=1
, whereas codegen=False
does not specify it explicitly and thus takes the default value.
Let LLVM optimize the whole code during linking. Three modes can be set with -C lto=?
:
no
: self-explanatoryfat
: optimizations across whole code; longest build timethin
: compromise between fat and disabled; significantly faster build time
If the option -C lto
is not provided or not specified with the options above, LTO can still be enabled. To avoid ambiguities, we always specify the LTO options in our optimized builds.
LTO (thin or fat) does not always lead to improvement. Furthermore, while fat lto is much slower to compile, it is not always better than thin LTO. See here for details.
Specifyinglto
in RUSTFLAGS does not work and giveserror: lto can only be run for executables, cdylibs and static library outputs
. Hence, it need to be specified in Cargo.toml
TODO
Find your CPU architecture with
rustc --print target-cpus
Taking target-cpu = native
will automatically take the most specific (advanced) architecture.
TODO