- cross-posted to:
- rust@lemmy.ml
- cross-posted to:
- rust@lemmy.ml
With all the respect to the author and his
wild
experiments, that title does not match the linker-only focus of the content.So not only the post ended up with two (IMHO) bad recommendations (disabling debug info, building non-relocatable binaries with musl). But it also didn’t mention other important factors like
codegen-units
andcodegen-backend
. Since you know, code generation is the other big contributor to the cycle time (the primary contributor even, in many cases). There is also other relevant options likelto
andopt-level
.Let’s assume that
opt-level
shouldn’t be changed from defaults for no good reason.With
codegen-units
, it’s not the default that is the problem, but the fact that some projects set it to 1 (for performance optimization reasons), but without adding a separate profile for development release builds (let’s call itrelease-dev
).Same goes for
lto
, where you can have it set to"full"
in your optimized profile, and completely"off"
inrelease-dev
.And finally, with
codegen-backend
, you can enjoy what is probably the biggest speed up in the cycle by usingcranelift
in yourrelease-dev
profile.And of course you are not limited to just two release profiles. I usually use 3-4 myself. Profile inheritance makes this easy.
And finally, you can set/not set some of those selectively for your dependencies. For example, not using
cranelift
for dependencies can render the runtime performance delta negligible in some projects.
Using the parallel rustc front-end might become an interesting option too, but it’s not ready yet.
[target.x86_64-unknown-linux-gnu] linker = "/usr/bin/clang-15"` rustflags = ["-C", "link-arg=--ld-path=/usr/local/bin/mold"]
Can you put something like
mold
orenv mold
for better portability?If not, I guess it’s not so bad to edit and do
git update-index --assume-unchanged .cargo/config.toml
but it’s a bit hacky since any further changes also get ignored.