# Summary Today, Zed uses Mold on Linux, but Wild can be significantly faster. On my machine, Wild is 14% faster at a whole-tree clean build, 20% faster on an incremental build with a minimal change, and makes no measurable effect on runtime performance of tests. However, Wild's page says it's not yet ready for production, so it seems to early to switch for production and CI builds. This PR keeps using Mold in CI and lets developers choose in their own config what linker to use. (The downside of this is that after landing this change, developers will have to do some local config or it will fall back to the default linker which may be slower.) [Wild 0.6 is out, and their announcement has some benchmarks](https://davidlattimore.github.io/posts/2025/09/23/wild-update-0.6.0.html). cc @davidlattimore from Wild, just fyi # Tasks - [x] Measure Wild build, incremental build, and runtime performance in different scenarios - [x] Remove the Linux linker config from `.cargo/config.toml` in the tree - [x] Test rope benchmarks etc - [x] Set the linker to Mold in CI - [x] Add instructions to use Wild or Mold into `linux.md` - [x] Add a script to download Wild - [x] Measure binary size - [x] Recommend Wild from `scripts/linux` # Benchmarks | | wild 0.6 (rust 1.89) | mold 2.37.1 (1.89) | lld (rust 1.90) | wild advantage | | -- | -- | -- | -- | -- | | clean workspace build | 176s | 184s | 182s | 5% faster than mold | | nextest run workspace after build | 137s | 142s | 137s | in the noise? | | incremental rebuild | 3.9s | 5.0s | 6.6s | 22% faster than mold | I didn't observe any apparent significant change in runtime performance or binary size, or in the in-tree microbenchmarks. Release Notes: - N/A --------- Co-authored-by: Mateusz Mikuła <oss@mateuszmikula.dev>
25 lines
1.6 KiB
TOML
25 lines
1.6 KiB
TOML
# This config is different from config.toml in this directory, as the latter is recognized by Cargo.
|
|
# This file is placed in ./../.cargo/config.toml on CI runs. Cargo then merges Zeds .cargo/config.toml with ./../.cargo/config.toml
|
|
# with preference for settings from Zeds config.toml.
|
|
# TL;DR: If a value is set in both ci-config.toml and config.toml, config.toml value takes precedence.
|
|
# Arrays are merged together though. See: https://doc.rust-lang.org/cargo/reference/config.html#hierarchical-structure
|
|
# The intent for this file is to configure CI build process with a divergance from Zed developers experience; for example, in this config file
|
|
# we use `-D warnings` for rustflags (which makes compilation fail in presence of warnings during build process). Placing that in developers `config.toml`
|
|
# would be incovenient.
|
|
# The reason for not using the RUSTFLAGS environment variable is that doing so would override all the settings in the config.toml file, even if the contents of the latter are completely nonsensical. See: https://github.com/rust-lang/cargo/issues/5376
|
|
# Here, we opted to use `[target.'cfg(all())']` instead of `[build]` because `[target.'**']` is guaranteed to be cumulative.
|
|
[target.'cfg(all())']
|
|
rustflags = ["-D", "warnings"]
|
|
|
|
# Use Mold on Linux, because it's faster than GNU ld and LLD.
|
|
#
|
|
# We no longer set this in the default `config.toml` so that developers can opt in to Wild, which
|
|
# is faster than Mold, in their own ~/.cargo/config.toml.
|
|
[target.x86_64-unknown-linux-gnu]
|
|
linker = "clang"
|
|
rustflags = ["-C", "link-arg=-fuse-ld=mold"]
|
|
|
|
[target.aarch64-unknown-linux-gnu]
|
|
linker = "clang"
|
|
rustflags = ["-C", "link-arg=-fuse-ld=mold"]
|