Уменьшение размера .wasm¶
Для .wasm-бинарников, которые мы отдаём клиентам по сети — как в нашем веб-приложении «Игра жизни» — важно следить за размером кода. Чем меньше .wasm, тем быстрее загружается страница и тем лучше для пользователей.
Насколько можно уменьшить .wasm «Игры жизни» за счёт настроек сборки?¶
Немного времени на обзор опций сборки, которые можно подкрутить для меньшего размера .wasm.
При стандартной конфигурации release-сборки (без отладочных символов) наш WebAssembly-бинарник занимает 29 410 байт:
1 2 | |
После включения LTO, установки opt-level = "z" и запуска wasm-opt -Oz итоговый .wasm сжимается всего до 17 317 байт:
1 2 | |
А если сжать его gzip (как делает почти каждый HTTP-сервер), получается скромные 9 045 байт!
1 2 | |
Упражнения¶
-
С помощью утилиты
wasm-snipуберите из.wasm«Игры жизни» инфраструктурные функции для паники. Сколько байт это экономит? -
Соберите крейт «Игра жизни» с
wee_allocв качестве глобального аллокатора и без него. В шаблонеrustwasm/wasm-pack-template, с которого мы начинали проект, есть cargo-фичаwee_alloc: её можно включить, добавив её в ключdefaultв секции[features]файлаwasm-game-of-life/Cargo.toml:1 2
[features] default = ["wee_alloc"]Насколько уменьшается размер
.wasmпри использованииwee_alloc? -
Мы создаём только один экземпляр
Universe, поэтому вместо конструктора можно экспортировать операции, которые работают с одним глобальным экземпляромstatic mut. Если этот глобальный экземпляр использует двойную буферизацию из предыдущих глав, буферы тоже можно сделать глобальнымиstatic mut. Тогда в реализации «Игры жизни» не остаётся динамического выделения памяти, и крейт можно сделать#![no_std]без аллокатора. Насколько уменьшился.wasmпосле полного отказа от зависимости на аллокатор?