2013-08-06 2 views
0

Когда я использую 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 

В результате мы могли бы найти теплую систему, которая действительно работает быстро, а затем холодная система. Но второй раз все еще очень длинный, по сравнению с серализацией двух экземпляров одного и того же типа дважды.

+0

Как вы собираетесь «использовать этот кеш для улучшения первого времени сериализации (sic)»? Кэширование может только повысить производительность последующих прогонов. Однако можно отметить, что 'DataContractSerializer' никогда не был разработан для производительности, но для совместимости. Рассмотрите другой Сериализатор, если производительность является проблемой. – Aron

ответ

1

Вы здесь ошибочные ошибки. Вы сравниваете холодную систему - первую сериализацию - с теплой системой - вторую сериализацию.

Попробуйте выполнить сериализацию двух разных экземпляров, и вы увидите, что вторая сериализация еще быстрее.

Другими словами: Кэш отсутствует.

Также не забудьте прочитать серии Эрика Липперта около Benchmarking mistakes.

+0

Вы правы в теплой системе, я сделал еще один тест, и из теста кажется, что «кеш» действительно существует. Могли бы посмотреть обновление в вопросах? Благодарю. – 2power10

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