Xml сериализация в .Net Framework 2.0
Страница 5. Вопросы производительности


 

Вопросы производительности

Cоздание экземпляра класса XmlSerializer довольно дорогая операция. Дело в том, что для переданного в конструктор типа, динамически создаются и компилируются сборки, содержащие код, предназначенный для сериализации именно этого типа. В результате собственно Xml сериализация выполняется довольно быстро, а вот создание экземпляров XmlSerializer занимает очень много времени. Кроме того, созданные сборки не выгружаются в результате возникает утечка памяти. В Framework 1.0 все было совсем плохо, и поэтому в одном из приложений, которое активно использовало Xml сериализацию, я создал небольшой класс, который кэширует экземпляры XmlSerializer, используя в качестве ключа полное имя типа класса подлежащего сериализации:
/// <summary>

/// Кэш для используемых сериалайзеров

/// </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;
}
}
Этот маленький класс сотворил чудо. Везде где мне нужен экземпляр XmlSerializer, вместо конструктора я использую SerializerCache.GetSerializer(). В результате производительность операций xml сериализации выросла на порядок.

Во 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

Как видно, кэширование экземпляров XmlSerializer по прежнему дает почти семикратный выигрыш во времени исполнения. Поэтому я рекомендую использовать эту технику, если ваше приложение активно использует Xml сериализацию.
 
Следующая статья »