Я переживаю странную вещь за последние пару дней. Я обнаружил, что моя версия 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 и перестроил его, и он снова работает быстро.