DataContractSerializer的缓存在哪里?

时间:2013-08-06 08:22:39

标签: .net performance wcf

当我使用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

任何人都知道我在哪里可以找到“缓存”,因此我可以使用此缓存来改善第一个版本化时间。

更新 看完@Daniel Hilgarth的回答后,我又做了一次测试。他对温暖的系统是正确的,但从我的测试结果来看,它似乎确实存在一些“缓存”。

我选择两种不同类型的实例: 第一次测试:

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

第二

14346583
7543526

从结果中,我们可以发现温暖的系统真的比冷系统快。但是第二次仍然很长,相比之下两次同一类型的两个实例被隔离。

1 个答案:

答案 0 :(得分:1)

你在这里犯了一个常见的错误。您正在将冷系统(第一个序列化)与温暖系统(第二个序列化)进行比较。

尝试序列化两个不同的实例,您会看到第二个序列化仍然更快。

换句话说:没有缓存。

另外,请务必阅读Eric Lippert关于Benchmarking mistakes的系列文章。