C#反序列化O(n * n)行为?

时间:2011-01-24 19:42:41

标签: c# serialization binary

我有一个可序列化的类(称之为A),实现了ISerializable。

如果我在阵列中序列化大约11K这些(作为阵列),反序列化需要大约1.3GB的最大VM大小才能将大约170MB的磁盘映像读入250MB的最终VM大小。这需要大约5分钟(经过时间),4:20分钟(CPU时间)。

如果我将上述每个11K对象分别序列化到同一个文件(连同计数指示器),反序列化需要大约250MB的最大VM大小才能将略小(160MB)的磁盘映像读入250MB的最终VM尺寸。这需要大约35秒(经过时间),20秒(CPU时间)。

任何想法为什么?似乎很奇怪。上述两种情况都使用二进制序列化。

P.S。如果它是相关的,则在A的实例中有一堆包含的可序列化对象。每个这些序列化对象都是实现ISerializable的类的实例。

2 个答案:

答案 0 :(得分:1)

我认为增量序列化过程比complete.array的序列化花费的时间更少,因为这个增量过程创建了短期对象。即,当每个对象序列化完成时,不再引用在序列化过程中创建的那些对象,而我可以想象整个数组的序列化导致许多对象被引用更长时间。 .net垃圾收集器针对生命周期较短的对象进行了优化,其中许多对象大多保存在cpu缓存中,直到a.generation 0集合。

我建议使用内存分析器并找出问题所在。我过去使用过ANTS内存分析器,可以推荐它。

答案 1 :(得分:1)