Сборка .Net Release работает медленнее, чем Debug - PullRequest
5 голосов
/ 21 апреля 2009

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

1. Проблема

Я, наконец, удалил все вещи из моей точки входа (Main) в моем Windows Forms exe, оставив только это:

 [STAThread]
 static void Main(params string[] args)
 {
     Stopwatch sw = Stopwatch.StartNew();
     System.Xml.Serialization.XmlSerializer xmlS =
         new System.Xml.Serialization.XmlSerializer(typeof(TestClass));
     sw.Stop();
     MessageBox.Show(sw.Elapsed.ToString());
 }

Так что я на самом деле больше не создаю экземпляры каких-либо Форм, а только проверяю. TestClass - это небольшой класс с тремя открытыми int свойствами и ничем иным. Мой основной файл .exe (Windows Forms) имеет размер ~ 1 МБ, если это имеет какое-либо значение.

2. Результаты

В режиме отладки мое истекшее время составляет ~ 200 мс, в то время как в выпуске это занимает ~ 1,2 с.

3. Дополнительная информация

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

4. Быстрый взлом

Чтобы исправить эту ошибку как можно быстрее, я создал новый стартовый проект .exe в своем решении, который создает и запускает основную форму заявки, ссылаясь на мой первый проект ввода. В этом случае он снова работает быстро, моя запись exe теперь имеет размер всего 24 КБ и содержит только статический метод Main.

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

[Редактировать] Дополнительная информация: Мне известно, что XmlSerializer генерирует код IL во время выполнения, но мой реальный вопрос заключается в том, почему он работает медленнее в этом случае, чем в других случаях. Когда я тестирую только фактическую сериализацию, она в 3 раза медленнее в Release (но только если я запускаю ее из своего первоначального проекта).

[Обновление] Теперь самое странное из всех: После пары шагов изменения / перестройки мой новый начальный проект начал вести себя как первый - медленный запуск, медленная загрузка. Я изменил название проекта и GUID и перестроил его, и он снова работает быстро.

1 Ответ

6 голосов
/ 21 апреля 2009

Я думаю, возможно, это связано с тем, что XmlSerializer выполняет NGEN-иш во время запуска в режиме выпуска, но не в режиме отладки. Смотрите, например,

http://blogs.msdn.com/billwert/archive/2008/02/23/use-of-sgen-exe-to-avoid-common-xmlserializer-performance-pitfalls.aspx

для некоторых деталей.

...