Что опция “Optimize Code” действительно делает в Visual Studio?

Название опции говорит что-то, но какую Visual Studio / компилятор действительно делают и каковы реальные последствия?

Править: При поиске Google, можно найти этот адрес, но это не действительно, я ищу. Интересно реальные вещи, происходящие. Например, почему циклы получают меньше времени и т.д.

72
задан spinodal 7 December 2008 в 10:34
поделиться

3 ответа

Без оптимизации компилятор производит очень немой код - каждая команда компилируется очень простым способом, так, чтобы это сделало намеченную вещь. Сборкам Отладки отключили оптимизацию по умолчанию, потому что без оптимизации произведенный исполняемый файл соответствует исходному коду простым способом.

Переменные сохранили в регистрах

, Как только Вы включаете оптимизацию, компилятор применяет много различных методов для создания кода выполненным быстрее, все еще делая то же самое. Наиболее заметным отличием между оптимизированными и неоптимизированными сборками в Visual C++ является факт, которым значения переменных сохранены в регистрах максимально долго в оптимизированных сборках, в то время как без оптимизации они всегда хранятся в память. Это влияет не только на скорость кода, но и она также влияет на отладку. В результате этой оптимизации отладчик не может надежно получить значение переменной, когда Вы ступаете через код.

Другая оптимизация

существует несколько другой оптимизации, примененной компилятором, как описано в /O Опции (Оптимизируйте Код), документы MSDN . Поскольку общее описание различных методов оптимизации видит статья .

Wikipedia Compiler Optimization
59
ответ дан user1991179 7 November 2019 в 08:35
поделиться

От Paul Vick блог:

  • Это удаляет любые инструкции по NOP, что мы иначе испустили бы для помощи в отладке. Когда оптимизация выключена (и отладочная информация включена), компилятор испустит инструкции по NOP для строк, которые не имеют никакого фактического IL связанным с ними, но которые Вы могли бы хотеть поставить точку останова. Наиболее распространенным примером чего-то вроде этого был бы “End If“ оператора “If” - нет никакого фактического IL, испускаемого для Конца, Если, таким образом, мы не испускаем NOP, отладчик не позволит Вам установить точку останова на нем. Включение оптимизации вынуждает компилятор не испустить NOPs.

  • Мы делаем простой анализ базисного блока сгенерированного IL для удаления любых блоков мертвого кода. Таким образом, мы разбиваем каждый метод на блоки IL, разделенного командами перехода. Путем выполнения быстрого анализа того, как блоки находятся во взаимосвязи, мы можем определить любые блоки, которые не имеют никаких ответвлений в них. Таким образом мы можем выяснить блоки кода, которые никогда не будут выполняться и могут быть опущены, делая блок немного меньшим. Мы также делаем некоторую незначительную оптимизацию ответвления в этой точке также - например, если Вы GoTo другой Оператор перехода, мы просто оптимизируем первый GoTo для перехода к цели второго GoTo.

  • Мы испускаем DebuggableAttribute с набором IsJITOptimizerDisabled ко Лжи. В основном это позволяет JIT во время выполнения оптимизировать код, как это считает целесообразным, включая переупорядочение и встраивание кода. Это произведет более эффективный и меньший код, но это означает, что попытка отладить код может быть очень сложной (как любой, кто попробовал его, скажет Вам). Фактический список того, что оптимизация JIT, является чем-то, что я не знаю - возможно, кто-то как Chris Brumme вмешается в какой-то момент на этом. Длинное и за исключением него - то, что переключатель оптимизации включает оптимизацию, которая могла бы сделать точки останова установки и продвижение через Ваш код тяжелее.

16
ответ дан reva 7 November 2019 в 08:35
поделиться

Короткий ответ: используйте - Вол и позвольте компилятору сделать свое задание.

длинный ответ: эффект другого вида оптимизации невозможно предсказать точно. Иногда оптимизация для быстрого кода на самом деле приведет к меньшему коду, оптимизируя для размера. Если Вы действительно хотите получить последние 0,01% производительности (speedwise или sizewise), необходимо сравнить различной комбинации опций.

кроме того, последние версии Visual Studio имеют опции для более усовершенствованной оптимизации, такой как разовая ссылкой оптимизация и ведомая профилем оптимизация.

2
ответ дан JesperE 7 November 2019 в 08:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: