Я пытаюсь оптимизировать свое приложение для того, чтобы он работал хорошо сразу после его запуска. На данный момент его распространение содержит 304 двоичных файла (включая внешние зависимости) на общую сумму 57 мегабайт. Это приложение WPF, использующее в основном доступ к базе данных без каких-либо значительных вычислений.
Я обнаружил, что для большинства операций конфигурация Debug обеспечивает более высокий (~ 5 раз) раз, так как они выполняются в первый раз в течение всего жизненного цикла процесса приложения. Например, открытие определенного экрана в приложении занимает 0,3 секунды для NGENed Debug, 0,5 секунды для JITted Debug, 1,5 секунды для NGENed Release и 2,5 секунды для JITted Release.
Я понимаю, что разрыв в времени компиляции JIT вызван компилятором JIT, применяющим более агрессивные оптимизации для двоичных файлов Release. Из того, что я могу сказать, конфигурации Debug и Release отличаются переключателями /p:DebugType
и /p:Optimize
, переданными компилятору С#, но я вижу тот же самый разрыв в производительности, даже если я создаю приложение с /p:Configuration=Release /p:DebugType=full /p:Optimize=false
- то есть то же самое Параметры отладки изображения, как в /p:Configuration=Debug
.
Я подтверждаю, что параметры были применены, посмотрев на DebuggableAttribute
, примененный к результирующей сборке. Наблюдая за выходом NGEN, я вижу, что <debug>
добавлен к именам компилируемых компиляций - как NGEN различает отладочные и не-отладочные сборки? Проверяемая операция использует генерацию динамического кода - какой уровень оптимизации применяется к динамическому коду?
Примечание. Я использую 32-разрядную структуру из-за внешних зависимостей. Должен ли я ожидать разные результаты на x64?
Примечание. Я также не использую условную компиляцию. Таким образом, скомпилированный источник одинаковый для обеих конфигураций.