gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 11:41:05 25 4
gpt4 key购买 nike

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

如果我在一个数组中序列化其中的大约 11K(作为一个数组),反序列化需要大约 1.3GB 的最大 VM 大小才能将大约 170MB 的磁盘镜像读入 250MB 的最终 VM 大小。这大约需要 5 分钟(运行时间)、4:20 分钟(CPU 时间)。

如果我将上述 11K 对象中的每一个单独序列化到同一个文件(连同计数指示器),反序列化需要大约 250MB 的最大 VM 大小才能将稍小 (160MB) 的磁盘镜像读取到 250MB 的最终 VM 中尺寸。这大约需要 35 秒(耗用时间)、20 秒(CPU 时间)。

有什么想法吗?似乎很奇怪。以上两种情况都使用二进制序列化。

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

最佳答案

我假设增量序列化过程比整个数组的序列化花费的时间更少,因为这个增量过程创建了短暂的对象。也就是说,当每个对象序列化完成时,不再引用在序列化过程中创建的那些对象,而我认为整个数组的序列化会导致许多对象被引用更长时间。 .net 垃圾收集器针对生命周期较短的对象进行了优化,其中许多对象大部分都保存在 cpu 缓存中,直到第 0 代收集为止。

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

关于C# 反序列化 O(n*n) 行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4786337/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com