Когда я использую DataContractSerializer для сериализации большого экземпляра, он будет стоить много раз. Однако, если эта сериализация произойдет во второй раз, она станет действительно быстрой. Кажется, в памяти существует какой-то «кеш». Мой тестовый код, как показано ниже:Где находится кеш DataContractSerializer?
//Create a big instance
object instance = ObjectInitializer.CreateObjectWithValue(type);
DataContractSerializer ser = new DataContractSerializer(type);
MemoryStream ms = new MemoryStream();
Stopwatch watcher = Stopwatch.StartNew();
ser.WriteObject(ms, instance);
watcher.Stop();
Console.WriteLine(watcher.ElapsedTicks);
ser = new DataContractSerializer(type);
watcher = Stopwatch.StartNew();
ser.WriteObject(ms, instance);
watcher.Stop();
Console.WriteLine(watcher.ElapsedTicks);
Программа выхода:
8605177
36970
Каждый знает, где я мог бы найти, что «кэш», так что я мог бы использовать этот кэш, чтобы улучшить в первый раз seralization.
Обновление: После просмотра ответа Даниэля Хильгарта я проведу еще один тест. Он прав насчет теплой системы, но из моего результата теста кажется, что на самом деле существует некоторый «кеш».
выбрать два различных типа экземпляров: Первый тест:
watcher = Stopwatch.StartNew();
ser1.WriteObject(ms, instance1);
watcher.Stop();
Console.WriteLine(watcher.ElapsedTicks);
watcher = Stopwatch.StartNew();
ser2.WriteObject(ms, instance2);
watcher.Stop();
Console.WriteLine(watcher.ElapsedTicks);
Второй тест ВЗУ последовательность двух экземпляра:
watcher = Stopwatch.StartNew();
ser2.WriteObject(ms, instance2);
watcher.Stop();
Console.WriteLine(watcher.ElapsedTicks);
watcher = Stopwatch.StartNew();
ser1.WriteObject(ms, instance1);
watcher.Stop();
Console.WriteLine(watcher.ElapsedTicks);
Результаты: первая:
8630129
10796746
2-й :
14346583
7543526
В результате мы могли бы найти теплую систему, которая действительно работает быстро, а затем холодная система. Но второй раз все еще очень длинный, по сравнению с серализацией двух экземпляров одного и того же типа дважды.
Как вы собираетесь «использовать этот кеш для улучшения первого времени сериализации (sic)»? Кэширование может только повысить производительность последующих прогонов. Однако можно отметить, что 'DataContractSerializer' никогда не был разработан для производительности, но для совместимости. Рассмотрите другой Сериализатор, если производительность является проблемой. – Aron