0

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

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

4

1 回答 1

1

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

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

换句话说:没有缓存。

另外,请务必阅读 Eric Lippert 关于基准测试错误的系列文章。

于 2013-08-06T08:28:45.133 回答