Как на производительность JIT-компиляции.NET (, включая динамические методы ), влияют параметры отладки изображений компилятора C #?

Я пытаюсь оптимизировать свое приложение, чтобы оно работало хорошо сразу после запуска. Сейчас,его дистрибутив содержит 304 двоичных файла (, включая внешние зависимости )общим объемом 57 мегабайт. Это приложение WPF, выполняющее в основном доступ к базе данных без каких-либо значительных вычислений.

Я обнаружил, что конфигурация отладки предлагает гораздо лучшее (~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, переданными компилятору C #, но я вижу тот же разрыв в производительности, даже если я создаю приложение с /p:Configuration=Release /p:DebugType=full /p:Optimize=false, то есть, те же параметры отладки изображения, что и в /p:Configuration=Debug.

Я подтверждаю, что параметры были применены, глядя на DebuggableAttribute, примененные к полученной сборке. Наблюдая за выводом NGEN, я вижу <debug>, добавленное к именам некоторых компилируемых сборок — как NGEN различает отладочные и неотладочные сборки -? Тестируемая операция использует генерацию динамического кода — какой уровень оптимизации применяется к динамическому коду?

Примечание. :Я использую 32-битную -платформу из-за внешних зависимостей. Стоит ли ожидать других результатов на x64?

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

15
задан BoltClock 7 May 2012 в 05:48
поделиться