Я испытываю странную вещь за последние пару дней. Я узнал, что моя версия Release фактически выполняет медленнее, чем версия Debug.. Чистая версия работает медленнее, чем Debug
1. Проблема
я, наконец, раздел все вещи из моего входа точки (Main) в моем Windows Forms еха, оставив только это:
[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) имеет размер ~ 1Mb, если это имеет значение.
2. Результаты
В режиме отладки, мой Прошедшее время ~ 200мс, в то время как в версии он занимает ~ 1.2s.
3. Дополнительная информация
Странное дело, когда я пытаюсь установить какой-либо другой проект в этом решении, как проект запуска, поскольку в этом случае она работает быстро (точно такой же код, как описано выше).
4. Быстрый хак
Чтобы исправить эту ошибку как можно быстрее, я создал новый проект EXE-Startup в моем решении, которое создает и запускает основную форму заявки путем ссылки на мой первый проект входа. В этом случае он снова работает быстро, мой входной exe теперь только 24kb большой, содержащий только статический метод Main.
С кем-либо сталкивалось подобное поведение раньше? Если бы я наткнулся на это где-то в другом месте, взглянув на вышеприведенный код, я бы предположил, что где-то есть статический инициализатор, выполняющий тонны работы в отдельном потоке (но здесь это не так, у меня нет этого), и, кроме того, работает только в сборке Release?
[Изменить] Дополнительная информация: Я знаю, что XmlSerializer генерирует код IL во время выполнения, но мой фактический вопрос заключается в том, почему в этом случае он работает медленнее, чем в других случаях. Когда я тестирую только фактическую сериализацию, она в 3 раза медленнее в Release (но только если я запускаю ее из моего первоначального проекта).
[Обновить] Теперь для самой странной части: после нескольких шагов модификации/восстановления мой новый проект ввода начал вести себя как первый - медленный запуск, медленная загрузка. Я изменил название проекта и GUID и перестроил его, и он снова работает быстро.
Учтите, что XmlSerializer генерирует класс во время выполнения для обработки фактической сериализации. Он создает код C# и компилирует его во время выполнения. –
Я так понимаю, но я не понимаю, почему это всегда медленнее в приложении Release exe.Кроме того, я могу создать экземпляр XmlSerializer, например, спать на 10 секунд, а затем выполнить фактический сериализационный 1000-таймер для сравнения - и он всегда медленнее в Release. – Groo