профилирование - профилировщик c#




Различия в производительности между сборками отладки и выпуска (6)

Должен признаться, что обычно я не беспокоился о переключении между конфигурациями Debug и Release в моей программе, и я обычно решил перейти на конфигурацию Debug , даже когда программы фактически развернуты на месте клиентов.

Насколько я знаю, единственная разница между этими конфигурациями, если вы не измените ее вручную, заключается в том, что Debug имеет константу DEBUG , а Release имеет код оптимизации .

Поэтому мои вопросы на самом деле двоякие:

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

  2. Есть ли какой-либо код, который будет работать нормально в конфигурации Debug, которая может завершиться неудачей в разделе «Конфигурация выпуска» , или вы можете быть уверены, что проверенный и хорошо работающий код в конфигурации Debug также отлично работает в конфигурации Release.


  1. Да, есть много различий в производительности, и они действительно применяются по всему вашему коду. Debug очень мало оптимизирует производительность и режим выпуска;

  2. Только код, который опирается на константу DEBUG может выполнять по-разному с помощью сборки релиза. Кроме того, вы не должны видеть никаких проблем.

Примером кода рамки, который зависит от константы DEBUG является метод Debug.Assert() , который имеет атрибут [Conditional("DEBUG)"] . Это означает, что он также зависит от константы DEBUG и это не входит в сборку релиза.


По моему опыту, самое худшее, что вышло из режима Release, - это неясные «ошибки выпуска». Поскольку IL (промежуточный язык) оптимизирован в режиме деблокирования, существует вероятность ошибок, которые не проявлялись бы в режиме отладки. Существуют и другие вопросы SO, охватывающие эту проблему: общие причины ошибок в версии выпуска, не присутствующие в режиме отладки

Это случилось со мной один или два раза, когда простое консольное приложение отлично работало в режиме отладки, но с учетом того же самого входа вышло бы сообщение об ошибке в режиме Release. Эти ошибки Чрезвычайно сложно отлаживать (по иронии судьбы, по определению режима Release).


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

Однако, если у вас много расчетных вычислений, вы заметите различия (может быть до 40%, как упоминал @Pieter, хотя это будет зависеть от характера вычислений).

Это принципиально компромисс между дизайном. Если вы создаете сборку DEBUG, то, если у пользователей возникнут проблемы, вы можете получить более значимую трассировку, и вы можете сделать гораздо более гибкую диагностику. Выпуская в сборку DEBUG, вы также избегаете оптимизатора, создающего неясные Heisenbugs .


Я бы сказал, что 1) во многом зависит от вашей реализации. Обычно разница не такая огромная. Я сделал много измерений, и часто я не видел разницы. Если вы используете неуправляемый код, множество огромных массивов и т. Д., Разница в производительности немного больше, но не в другом мире (например, на C ++). 2) Обычно в коде выпуска показано меньше ошибок (более высокий допуск), поэтому коммутатор должен работать нормально.


    **Debug Mode:**
    Developer use debug mode for debugging the web application on live/local server. Debug mode allow developers to break the execution of program using interrupt 3 and step through the code. Debug mode has below features:
   1) Less optimized code
   2) Some additional instructions are added to enable the developer to set a breakpoint on every source code line.
   3) More memory is used by the source code at runtime.
   4) Scripts & images downloaded by webresource.axd are not cached.
   5) It has big size, and runs slower.

    **Release Mode:**
    Developer use release mode for final deployment of source code on live server. Release mode dlls contain optimized code and it is for customers. Release mode has below features:
    More optimized code
    Some additional instructions are removed and developer can’t set a breakpoint on every source code line.
   1) Less memory is used by the source code at runtime.
   2) Scripts & images downloaded by webresource.axd are cached.
   3) It has small size, and runs fast.
   4) Scripts & images downloaded by webresource.axd are cached.
   5) It has small size, and runs fast.

  • Мой опыт в том, что приложения среднего или большего размера заметно более восприимчивы в сборке Release. Попробуйте приложение и посмотрите, как оно себя чувствует.

  • Одна вещь, которая может укусить вас в версиях Release, заключается в том, что код сборки Debug иногда может подавлять условия гонки и другие связанные с потоками ошибки. Оптимизированный код может привести к переупорядочению команд, а более быстрое выполнение может усугубить определенные условия гонки.







configuration