Xml сериализация в .Net Framework 2.0 - Вопросы производительности
ОГЛАВЛЕНИЕ
Страница 5 из 5
Вопросы производительности
Cоздание экземпляра класса XmlSerializer довольно дорогая операция. Дело в том, что для переданного в конструктор типа, динамически создаются и компилируются сборки, содержащие код, предназначенный для сериализации именно этого типа. В результате собственно Xml сериализация выполняется довольно быстро, а вот создание экземпляров XmlSerializer занимает очень много времени. Кроме того, созданные сборки не выгружаются в результате возникает утечка памяти. В Framework 1.0 все было совсем плохо, и поэтому в одном из приложений, которое активно использовало Xml сериализацию, я создал небольшой класс, который кэширует экземпляры XmlSerializer, используя в качестве ключа полное имя типа класса подлежащего сериализации:/// <summary>Этот маленький класс сотворил чудо. Везде где мне нужен экземпляр XmlSerializer, вместо конструктора я использую SerializerCache.GetSerializer(). В результате производительность операций xml сериализации выросла на порядок.
/// Кэш для используемых сериалайзеров
/// </summary>
internal class SerializerCache
{
private static Hashtable hash = new Hashtable();
public static XmlSerializer GetSerializer(Type type)
{
XmlSerializer res = null;
lock(hash)
{
res = hash[type.FullName] as XmlSerializer;
if(res == null)
{
res = new XmlSerializer(type);
hash[type.FullName] = res;
}
}
return res;
}
}
Во Framework 2.0 разработчики отчасти поправили положение. Теперь XmlSerializer сам кэширует создаваемые им сборки, правда происходит это только при использовании конструкторов System.Xml.Serialization.XmlSerializer(Type) System.Xml.Serialization.XmlSerializer(Type,String).
Я решил проверить, имеет ли теперь смысл использовать предложенный мной класс SerializerCache? Для этого выполним тест. Сначала сериализуем 1000 объектов DataClass создавая каждый раз новый экземпляр XmlSerialize. А затем сериализуем 1000 объектов DataClass используя SerializerCache (т.е. используя один экземпляр XmlSerializer). Измерим время, затраченное на два теста:
Direct serialization time 00:00:02.2574448
Cache serialization time 00:00:00.3135340