当我使用 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
从结果中,我们可以发现热系统运行速度确实比冷系统快。但是第二次仍然很长,与将同一类型的两个实例序列化两次相比。