Я испытываю действительно ОГРОМНОЕ снижение производительности при вызове простого XmlSerializer.Deserizlize () в классе с большим количеством полей.
ПРИМЕЧАНИЕ : I 'я пишу код дома без Visual Studio, поэтому в нем могут быть некоторые ошибки.
Мой сериализуемый класс плоский и имеет сотни полей:
[Serializable]
class Foo
{
public Foo() { }
[XmlElement(ElementName = "Field1")]
public string Field1;
// [...] 500 Fields defined in the same way
[XmlElement(ElementName = "Field500")]
public string Field500;
}
Мое приложение десериализует входную строку(даже небольшое):
StringReader sr = new StringReader(@"<Foo><Field1>foo</Field1></Foo>");
XmlSerializer serializer = new XmlSerializer(typeof(Foo));
object o = serializer.Deserialize(sr);
При запуске приложения в 32-битных системах (или с 32-битным принудительным использованием corflags.exe) код занимает ОДИН ВТОРОЙ в первый раз (временный класс сериализации)поколение, и все ...), затем оно близко к 0.
При запуске приложения в 64-битных системах код занимает ОДИН МИНУТ в первый раз, затем он близок к 0.
Что может привести к зависанию системы на столь длительное время при первом запуске XmlSerializer для большого класса в 64-битной системе?
Прямо сейчас я не уверен, должен ли ясоздание / удаление lame временного класса, инициализация таблицы имен xml, CAS, поиск Windows, антивирус или Санта-Клаус ...
SPOILERS
Вот мои тесты, донне читайте это, если вы не хотите, чтобы меня отвлекали мои (возможные) ошибки анализа.
- Запуск кода из отладчика Visual Studio делает код быстрым даже в 64-битных системах
- Добавление (полностью недокументированного) переключателя system.diagnostic "XmlSerialization.Compile", который не позволяет системе удалять временные классы сериализации, заставляет код работать FAST даже в 64-разрядных системах
- Взятие временного кодаКласс FooXmlSerializer, созданный средой выполнения, включая .cs в моем проекте и использующий его вместо XmlSerializer, заставляет код запускаться FAST даже в 64-разрядных системах
- Создание того же класса FooXmlSerializer с sgen.exe, включая.cs в моем проекте и использование его вместо XmlSerializer делает код быстрым даже в 64-битных системах
- Создание того же класса FooXmlSerializer с помощью sgen.exe, обращение к сборке Foo.XmlSerializers.dll в моем проекте и использование его вместо XmlSerializer заставляет код работать медленно даже в 64-разрядных системах (lot )
- Потеря производительности происходит только в том случае, если вход для десериализации фактически содержит поле большого класса (, это также вызывает у меня много проблем )
Чтобы пояснить последний пункт, если у меня есть класс:
[Serializable]
class Bar
{
public Bar() { }
[XmlElement(ElementName = "Foo")]
public Foo Foo; // my class with 500 fields
}
Десериализация медленная только при передаче потомка Foo.Даже если я уже выполнил десериализацию:
StringReader sr = new StringReader(@"<Bar></Bar>");
XmlSerializer serializer = new XmlSerializer(typeof(Bar));
object o = serializer.Deserialize(sr); // FAST
StringReader sr = new StringReader(@"<Bar><Foo><Field1>foo</Field1></Foo></Bar>");
XmlSerializer serializer = new XmlSerializer(typeof(Bar));
object o = serializer.Deserialize(sr); // SLOW
EDIT Я забыл сказать, что проанализировал выполнение с помощью Process Monitor, и не вижу ни одной задачи, отнимающей много времени умое приложение или из csc.exe, или что-нибудь, связанное с Framework.Система просто делает другие вещи (или я что-то упускаю), такие как антивирус, explorer.exe, индексация поиска Windows (уже пытались их отключить)