As a side-discussion from the ongoing mess I read this about Waiting 15 minutes for a small program, e.g. like Yazi to compile is wild.
I tried and on my laptop took about 2 minutes to build in release mode, not too bad.
❯ cargo build
...
Finished `dev` profile [unoptimized + debuginfo] target(s) in 27.51s
❯ cargo clean
❯ cargo build --release
...
Finished `release` profile [optimized] target(s) in 2m 01s
yazi isn't exactly a small program:
❯ cargo tree | grep -v yazi | wc -l
685
❯ tokei
===============================================================================
Language Files Lines Code Comments Blanks
===============================================================================
JSON 1 1 1 0 0
Lua 34 1973 1639 31 303
Markdown 2 207 0 149 58
Nix 4 270 235 6 29
Shell 3 56 41 6 9
TOML 18 1819 1484 128 207
YAML 1 33 29 1 3
-------------------------------------------------------------------------------
Rust 463 27288 22926 280 4082
|- Markdown 6 56 0 51 5
(Total) 27344 22926 331 4087
===============================================================================
Total 526 31647 26355 601 4691
===============================================================================
Then I looked a bit further and I saw:
[profile.release]
codegen-units = 1
lto = true
panic = "abort"
strip = true
Definitely not friendly if you want a fast release build
-
codegen-units = 1
may generate a bit more optimal code but then you can use only 1 core and if you have many... -
lto = true
tends to take lots of time for some optimality, butlto = "thin"
exists and the tradeoff tends to be very good, forrav1e
on x86_64 for a long while managed to produce even a better binary.
So what happens if I do those changes?
❯ cargo build --release
...
Finished `release` profile [optimized] target(s) in 47.05s
I guess sometimes it is better to not stop at the first program to evaluate if a toolchain is fast or slow :)
P.S.
If you are on Linux, at least right now the quickest combination seems to be clang
as linker with mold
doing the actual work.
gcc + mold
seems sensibly slower and clang + ld.bfd
is curiously a tad slower than gcc + ld.bfd
.
Setting
[target.{yourarch}]
linker = "clang"
rustflags = ["-C", "link-arg=-fuse-ld=mold"]
in ~/.cargo/config.toml
may be optimal at least right now.
Top comments (0)