2009-04-21 3 views
5

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

+0

Учтите, что XmlSerializer генерирует класс во время выполнения для обработки фактической сериализации. Он создает код C# и компилирует его во время выполнения. –

+0

Я так понимаю, но я не понимаю, почему это всегда медленнее в приложении Release exe.Кроме того, я могу создать экземпляр XmlSerializer, например, спать на 10 секунд, а затем выполнить фактический сериализационный 1000-таймер для сравнения - и он всегда медленнее в Release. – Groo

ответ

6

Возможно, это связано с тем, что XmlSerializer работает в режиме Release, но не в режиме отладки, работает NGEN-ish. См.

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

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

+0

Спасибо, я действительно использовал SGEN для создания сериализационных сборок в режиме Release, но в любом случае это было медленнее. Еще медленнее, когда я сначала создаю сериализатор, а затем тестирую только сериализацию. (кстати, ваша ссылка показывает это в mozilla: «Веб-сайт на www.topxml.com был сообщен как сайт атаки») – Groo

+0

Да, получите то же предупреждение. Также Google предупреждает об этом сайте: http://www.google.de/search?hl=de&q=site%3Awww.topxml.com –

+0

Спасибо, я исправил URL-адрес в исходном блоге msdn. – Brian

Смежные вопросы