Что такое 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
наклоняетсяпо умолчанию скорость больше размера, и если это вас не устраивает, вы можете выбрать другое направление оптимизации.