Přeskočit na obsah
Magazín Chatujme.cz
Programování · čtení na 3 min

Překladač Rustu zrychlil za osm měsíců o 5,6 %. Polovinu z toho udělal jediný nástroj

Nicholas Nethercote měří rychlost překladače Rustu deset let a jednou za čas sepíše, co se změnilo. Poslední shrnutí vyšlo 31. července: průměrné zkrácení doby překladu 5,59 %, z toho zhruba polovina připadá na dokumentační nástroj. Zajímavější než ta čísla jsou ale dva jednotlivé případy – jeden o prázdných voláních, druhý o osmi bajtech navíc.

Mechanické stopky s bílým ciferníkem
Doba překladu se u rustc měří automaticky při každé sloučené změně. Foto: Ansgar Koreng, Wikimedia Commons (CC BY-SA 4.0)

Nicholas Nethercote pracuje na rychlosti překladače Rustu deset let a jednou za čas sepíše, co se za tu dobu povedlo. Poslední díl vyšel 31. července 2026 a pokrývá období od 3. prosince 2025 do 29. července 2026.

Souhrnné číslo zní 5,59 % – o tolik se v průměru zkrátila doba běhu měřených úloh. Zhruba polovinu toho zisku ale nepřinesl samotný překladač, nýbrž rustdoc, nástroj na generování dokumentace: ten zrychlil v průměru o 37,92 %. Když se rustdoc z výpočtu vyjme, zbude 2,90 %.

To je poctivé rozlišení, které se v podobných shrnutích často ztrácí. Kdo překládá kód a dokumentaci negeneruje, těch pět a půl procenta nepocítí.

Kde se vzalo těch skoro čtyřicet procent

Za největší kus stojí čtyři změny Noaha Leva, které omezily práci při zpracování bloků impl. Autor shrnutí u nich přiznává, že jim do podrobností nerozumí – a cituje Guillauma Gomeze. Ten to shrnul větou, kterou tu překládáme: „to všechno proto, že někdo narazil na podivnou chybu při používání rustdocu.“

Druhá změna je vděčnější na vysvětlení. Jakub Beránek přidal měřicí úlohy rustdocu do trénovací sady pro PGO – optimalizaci, při které se program nejdřív spustí, změří se, kudy běh doopravdy chodí, a teprve pak se přeloží podle toho. Rustdoc díky tomu zrychlil v průměru o 2,85 %, v nejlepším případě přes šest procent. Nethercote k tomu píše, že se PGO nastavuje obtížně, ale umí hodně změnit – a že na trénovací sadě záleží.

Třetí je jeho vlastní: změna způsobu, jakým rustdoc řadí bloky impl. Dřív se řadily dlouhé vygenerované řetězce HTML, teď se řadí podle kratší textové podoby jména. Sloučeno 31. května 2026, dvacet přidaných a dvacet šest odebraných řádků; v nejlepším případě to ubralo přes šest procent instrukcí.

Většina volání nedělala nic

Nejnázornější případ se týká Clippy, nástroje na kontrolu stylu a častých chyb. Clippy má stovky samostatných kontrol a každá z nich může obsloužit několik desítek událostí – check_item, check_stmt, check_expr a další. Při průchodu stromem se pro každý uzel zavolá příslušná metoda u každé kontroly.

Jenže většina kontrol si všímá jen jedné události, často jediné. Zbylá volání tedy nedělají nic – a přesto je každé z nich virtuální, tedy takové, u kterého se cíl skoku hledá až za běhu. Vývojář vystupující jako xmakro našel způsob, jak průchody spojit tak, aby se prázdné metody nevolaly vůbec.

Nethercote zkoumal tentýž problém současně a přišel s vlastním řešením. Nesloučilo se – bylo funkčně rovnocenné, ale zasahovalo do kódu víc. Změřil u něj ale podrobnosti, které stojí za citaci: doba běhu Clippy klesla ve většině případů o 10 až 30 %, chybné předpovědi skoků o 20 až 80 % na skutečných příkladech a o 97 % na jednom zátěžovém testu.

Sám k tomu dodává, že po deseti letech práce na výkonu překladače zkoušel optimalizovat Clippy poprvé, našel vážný problém, opravil ho – a pak zjistil, že ho někdo o pár dní předběhl.

Osm bajtů nad mezí

Druhý případ je ještě konkrétnější a týká se nového řešitele takzvaných traitů, tedy té části překladače, která rozhoduje, jestli typ splňuje požadované vlastnosti. Vývojář lcnr upozornil na dva balíčky, kde nový řešitel běžel výrazně pomaleji.

Nethercote je proměřil a zjistil, že skoro polovinu času tráví překladač ve funkci memcpy, tedy prostým kopírováním paměti. Příčina: horké pole obsahovalo prvky o velikosti 136 bajtů. LLVM, které rustc používá na generování strojového kódu, přepíná u hodnot nad 128 bajtů z přímých instrukcí právě na volání memcpy.

Oprava udělala dvě věci: vyhnula se dvěma třetinám přesunů a zmenšila typ na 104 bajtů, aby zbylé přesuny pod tu mez spadly. U dvou nejhorších balíčků to zkrátilo dobu běhu o 40 %. Sloučeno 28. července 2026, sedmdesát tři přidaných řádků.

Naše hodnocení: tohle je poučnější než souhrnné procento. Osm bajtů nad prahem, o kterém programátor v Rustu běžně neuvažuje, protože ho určuje až vrstva pod ním.

Co ještě a kdo

U přírůstkového překládání – kdy se po úpravě nepřekládá všechno znovu – přibylo šest drobnějších změn od vývojářů vystupujících jako Zalathar, zetanumbers a xmakro; nejlepší z nich ubraly 5 až 10 % instrukcí.

Nový řešitel traitů se chystá na vydání a na jedné z měřicích úloh klesla doba běhu za tři měsíce z 27 sekund pod jednu. Nethercote zároveň upozorňuje, že o většině té práce sám nemá přehled.

Za zmínku stojí i to, kdo změny psal. Kromě dlouholetých přispěvatelů se objevují dvě nová jména: už zmíněný xmakro a arya dradjica, autorka experimentálního překladače Rustu zaměřeného na rychlost, která na práci nově dostává finanční podporu a věnuje se rozbalování maker.

Zdroje

Čísla u obou změn v seznamu jsou ověřená proti rozhraní GitHubu, ne jen proti shrnutí: autor, datum sloučení i rozsah zásahu sedí.

Diskuse

Zatím tu nikdo nediskutuje. Můžete být první.

Napsat příspěvek

Diskutovat můžete i bez účtu. S registrací se ale příspěvek zveřejní hned a nemusíte pokaždé vyplňovat jméno. Účet už máte? Přihlaste se.

Nezveřejňujeme ho, slouží jen redakci.

Podporuje zápis Texy: **tučně**, *kurzíva*, odrážky, odkazy.

Dál k tématu

Programování

Specifikace Vulkanu přidala volbu mezi menším obrazem v paměti a rychlejším přístupem

Khronos vydal 31. července aktualizaci specifikace Vulkanu 1.4.358 s jediným novým rozšířením. VK_EXT_image_tiling_control dovoluje u každého obrazu zvlášť říct, jestli má ovladač zvolit uspořádání dat, které šetří paměť, nebo to, které zrychluje přístup. Dosud to bylo na ovladači a aplikace do jeho volby neviděla.

Programování

Turso přepsal SQLite do Rustu, nad stejným jádrem teď staví Postgres. Zatím jen ze zdroje

Databázový projekt Turso, který vznikl jako přepis SQLite do jazyka Rust, oznámil 16. července, že nad stejným jádrem staví i Postgres. Autoři to popisují jako „LLVM databází“: jedno jádro a víc jazykových rozhraní nad ním. Hotová databáze to zatím není – balíčky ke stažení neexistují a oznámení samo mluví o základu, ne o hotovém produktu.

Programování

Pád ripgrepu ukazuje na chybu v jádře Linuxu. Model od OpenAI odmítl s laděním pomoct

Vývojář nahlásil 26. července, že ripgrep sestavený proti knihovně musl občas spadne při hledání v obřím stromu adresářů. O dva dny později zveřejnil analýzu, podle které za pádem stojí souběh ve správě paměti jádra Linuxu: vlákno přestane vidět bajt, který samo o deset instrukcí dřív zapsalo. Potvrzení od vývojářů jádra zatím není.