Что на самом деле делает опция «Оптимизировать код» в Visual Studio?

Имя параметра говорит о чем-то, но что на самом деле делает Visual Studio /компилятор и каковы реальные последствия?

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

70 голосов | спросил spinodal 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 22 Sep 2008 12:51:29 +0400 2008, 12:51:29

3 ответа


0

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

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

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

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

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

ответил Suma 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 22 Sep 2008 14:00:40 +0400 2008, 14:00:40
0

Из блога Пола Вика :

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

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

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

ответил reva 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 22 Sep 2008 14:03:04 +0400 2008, 14:03:04
0

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

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

Кроме того, в последних версиях Visual Studio есть опции для более сложных оптимизаций, таких как оптимизация во время соединения и оптимизация на основе профилей.

ответил JesperE 22 ndEurope/Moscowp30Europe/Moscow09bEurope/MoscowMon, 22 Sep 2008 13:14:56 +0400 2008, 13:14:56

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132