Подтвердить что ты не робот

С# Debug vs Release

Насколько выигрыш в производительности (если таковой имеется) может получить выгоду от службы Windows между сборкой и сборкой отладки и почему?

4b9b3361

Ответ 1

Для управляемого кода, если у вас нет большого количества материалов, условно скомпилированных для сборников DEBUG, должно быть мало различий - IL должен быть почти таким же. Дрожание генерируется по-разному при запуске под отладчиком или нет - компиляция в IL не сильно влияет.

Есть некоторые вещи, которые /optimize делает при компиляции в IL, но они не особенно агрессивны. И некоторые из этих оптимизаций IL, вероятно, будут обрабатываться оптимизацией дрожания, даже если они не оптимизированы в IL (например, удаление nops).

Подробнее см. статью Эрика Липперта http://blogs.msdn.com/ericlippert/archive/2009/06/11/what-does-the-optimize-switch-do.aspx:

Флаг/optimize не изменяет огромное количество нашей логики испускания и генерации. Мы стараемся всегда генерировать простой, проверяемый код, а затем полагаться на дрожание, чтобы сделать тяжелый подъем оптимизаций, когда он генерирует настоящий машинный код. Но мы сделаем некоторые простые оптимизации с этим набором флагов.

Чтение статьи Eric для информации о /optimize делает по-разному в генерации IL.

Ответ 2

Хорошо, хотя вопрос является дубликатом, я чувствую, что некоторые из лучших ответов в исходном вопросе находятся в самом низу. Лично я видел ситуации, когда есть заметная разница между режимами отладки и выпуска. (Пример: Производительность свойств, где разница между доступом к свойствам в режиме отладки и выпуска). Является ли эта разница будет присутствовать в реальном программном обеспечении (вместо того, чтобы тест, как программа) является спорным, но я видел это в одном продукте я работал.

От Нила ответьте на исходный вопрос, от msdn social:

Это плохо документировано, вот что я знаю. Компилятор выдает экземпляр System.Diagnostics.DebuggableAttribute. В отладочной версии свойство IsJitOptimizerEnabled равно True, в версии выпуска False. Этот атрибут можно увидеть в манифесте сборки с помощью ildasm.exe.

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

Отображение точек останова для адресов выполнения - это задание отладчика. Он использует файл .pdb и информацию, сгенерированную компилятором JIT, который предоставляет IL-команду для сопоставления адресов кода. Если вы напишете собственный отладчик, вы должны использовать ICorDebugCode:: GetILToNativeMapping().