当我使用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
从结果中,我们可以发现温暖的系统真的比冷系统快。但是第二次仍然很长,相比之下两次同一类型的两个实例被隔离。
答案 0 :(得分:1)
你在这里犯了一个常见的错误。您正在将冷系统(第一个序列化)与温暖系统(第二个序列化)进行比较。
尝试序列化两个不同的实例,您会看到第二个序列化仍然更快。
换句话说:没有缓存。
另外,请务必阅读Eric Lippert关于Benchmarking mistakes的系列文章。