Насколько выигрыш в производительности (если таковой имеется) может получить выгоду от службы Windows между сборкой и сборкой отладки и почему?
С# Debug vs Release
Ответ 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().