Headstart patcht rustc und Cargo: abhängige Crates starten früher, Builds bis 42 % schneller
Headstart, ein Projekt, das am 4. Oktober auf die Startseite von Hacker News kam, ist eine Reihe von Patches für den Rust-Compiler und Cargo, die ändert, wann eine Crate mit dem Kompilieren beginnen darf.
Die Idee. Heute wartet eine Crate, bis jede Crate, von der sie abhängt, vollständig geprüft ist – einschließlich der Funktionsrümpfe. Diese Rümpfe braucht sie aber gar nicht: Sie kompiliert gegen die Schnittstelle der Abhängigkeit, die Metadaten in deren .rmeta-Datei. Headstart lässt rustc eine frühe Metadatendatei schreiben, sobald die Schnittstelle geprüft ist, und lässt Cargo die abhängigen Crates darauf starten, während die Rümpfe der Abhängigkeit noch geprüft werden.
Wie es sich verhält. Bei cargo check laufen abhängige Crates mit den frühen Metadaten vollständig durch. Bei cargo build erledigen sie damit ihre gesamte Analyse und warten dann vor der Codeerzeugung auf die vollständigen Metadaten; währenddessen geben sie ihren Job-Slot frei. Enthält ein Rumpf einen Fehler, scheitert der Build weiterhin mit denselben Meldungen und demselben Exit-Status wie heute; nur Fortschrittszeilen und die Reihenfolge der JSON-Nachrichten über Crates hinweg können abweichen. Als Kosten nennt der Autor verworfene Arbeit in nachgelagerten Crates, etwas später gemeldete Fehler und mehr gleichzeitig belegten Speicher.

Die Patches. Sechs Patches für rustc hinter -Zearly-metadata und drei für Cargo hinter -Zheadstart, jeweils mit Commit-Nachricht und Tests.
Die Zahlen. Mit dem Standard-Frontend von rustc wurden saubere Builds von 13 echten Projekten – darunter rust-analyzer, Zed, Bevy, Lemmy und Polars – bei cargo check bis zu 54 % und bei cargo build bis zu 42 % schneller, keines wurde langsamer. Mit dem parallelen Frontend (-Zthreads=8), das teils dieselbe Lücke nutzt, beträgt der Gewinn bis zu 25 %. Das sind Werte auf 16 Kernen: Der Vorteil kommt von Kernen, die ein Build sonst ungenutzt ließe, und schrumpft daher auf kleineren Maschinen. Auf 4 Kernen war der Check von rust-analyzer 24 % schneller, der Build 13–15 %.
Es handelt sich um instabile Flags in einer Patch-Serie, nicht um eine übernommene Funktion; ob etwas Vergleichbares upstream landet, entscheiden die Teams von Rust-Compiler und Cargo.