Почему использование LTO увеличивает размер моего бинарного файла Rust? - PullRequest
0 голосов
/ 12 сентября 2018

Введение

Я закончил небольшой проект Rust (около 300 строк кода) со следующими зависимостями:

Проблема

Когдаиспользуя cargo build --release без дальнейшей настройки, генерируется двоичный файл размером 2,942,744 байта (= 2,8 МиБ).Я попытался оптимизировать это, включив Оптимизацию времени соединения (LTO) в моем Cargo.toml:

[profile.release]
lto = true

. К моему удивлению, двоичный файл увеличивается с новым размером 3.848.288 байт (= 3,7MiB).

Как это можно объяснить?Есть ли какая-то ошибка, которую я допустил при настройке Cargo?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Что такое LTO?

LTO означает оптимизацию времени соединения.Как правило, он настроен на использование обычных проходов оптимизации, используемых для создания объектных файлов ... вместо этого во время компоновки или дополнительно.

Почему это важно?

Компилятор по своей сути не имеетоптимизировать скорость за размер или размер за скорость;и, следовательно, ни LTO.

Вместо этого при вызове компилятора пользователь выбирает профиль.Для rustc:

  • O0, O1, O2 и O3 оптимизируются для скорости.
  • Os и Oz оптимизируются дляsize.

LTO можно комбинировать поверх любого уровня оптимизации и будет следовать выбранному профилю.

Так почему размер увеличился?

По умолчаниюпрофиль [release] предписывает cargo вызывать rustc с O2 или O3, что пытается оптимизировать скорость по размеру.

В частности, O3 может довольно сильно полагаться на встраивание.Инлайн - это все, что дает оптимизатору больше контекста и, следовательно, больше возможностей для оптимизации ... LTO дает больше шансов применить инлайнинг (более известные функции), и здесь, похоже, произошло больше инлайнинга.

Так почему же это сообщение в блоге утверждать, что оно уменьшенного размера?

Это также уменьшает размер.Возможно.

Предоставляя больше контекста, оптимизатор / компоновщик может понять, что некоторая часть кода или зависимостей вообще не используется, и, следовательно, может быть исключена.

При использовании Osили Oz, размер почти наверняка уменьшится.

При использовании O2 или O3 неиспользуемый код удаляется, в то время как вставка добавляет больше кода, поэтому совершенно непредсказуемо, будет ли конечный результат большеили меньше.

Итак, LTO?

LTO дает оптимизатору лучшую возможность для оптимизации, так что это хороший вариант по умолчанию для выпусков.

Просто помните, что cargo наклоняетсяпо умолчанию скорость больше размера, и если это вас не устраивает, вы можете выбрать другое направление оптимизации.

0 голосов
/ 12 сентября 2018

Возможно из-за встраивания, что может увеличить размер кода для увеличения скорости.

...