
Код Debug, згенерований derive у Rust, у одному випадку додав до uv близько 160KB
Rust зараз додає підказки inline до коду, створеного кількома макросами derive. В одному випадку через велику реалізацію Debug накопичений повторюваний код дозволив зменшити проєкт uv приблизно на 160KB.
Підказки inline як результат derive у Rust
Розробники Rust часто використовують #[derive(...)], щоб згенерувати базові трейти, такі як Debug, Display і Clone. Автор виявив, що Rust зараз для частини цих похідних видає #[inline].
Ця поведінка не гарантована, але приклад у довіднику це передбачає і вона видна під час розгортання макросів. У більшості випадків згенерована підказка бажана, бо похідні реалізації часто малі і дають виграш від інлайнінгу. Атрибут усе одно залишається підказкою, а не наказом.
Чому вбудовані помилки можуть розширювати код
Великі реалізації не завжди виграють від інлайнінгу. Ієрархія з трьох структур помилок і одного enum помилки створила для їхніх похідних реалізацій Debug досить великий обсяг коду. Велика частина цього коду могла б інлайнитися щоразу, коли викликалася реалізація enum верхнього рівня.
Такі виклики можуть траплятися неодноразово під час debug або trace логування. Ієрархія в прикладі описана явно спрощено, адже в реальних застосунках Rust часто зустрічаються глибоко вбудовані enum помилок із нетривіальною кількістю полів. У результаті інлайнований код може становити нетривіальну частину повного розміру бінарника Rust.
Зменшення розміру бінарника uv
Автор і команда виявили, що бінарник uv можна було б зменшити приблизно на 160KB, якби rustc не давав змоги інлайнити конкретну реалізацію Debug. Результат був дивовижним, бо витрати розміру швидко накопичувалися і не було видно, що rustc обмежує розмір інлайнованої реалізації або те, як часто вона інлайниться.
Щоб досягти зменшення, команда додала власний процедурний макрос, який поводився подібно до derive(Debug), але використовував #[inline(never)]. Цей випадок показує, як згенеровані підказки inline можуть впливати на розмір бінарника, коли похідна реалізація використовується через глибоке вкладення типу.
SiTech — веброзробка з підтримкою AI
Створюємо швидкі та сучасні сайти й інтегруємо AI у бізнес-процеси. Маєте проєкт чи запитання? Із задоволенням допоможемо.