为什么复制一个流然后使用BinaryFormatter反序列化比仅仅反序列化要快?

本文关键字:反序列化 BinaryFormatter 然后 复制 一个 为什么 | 更新日期: 2023-09-27 17:51:14

对于来自数据库中的blob的包含约65K的流,此代码大约需要8秒

private string[] GetArray(Stream stream)
{
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    object result = binaryFormatter.Deserialize(stream);
    return (string[])result;
}

这段代码需要几毫秒:

private string[] GetArray(Stream stream)
{
    BinaryFormatter binaryFormatter = new BinaryFormatter();
    MemoryStream memoryStream = new MemoryStream();
    Copy(stream, memoryStream);
    memoryStream.Position = 0;
    object result = binaryFormatter.Deserialize(memoryStream);
    return (string[])result;
}

为什么?

为什么复制一个流然后使用BinaryFormatter反序列化比仅仅反序列化要快?

所以您说当数据库被排除在外时问题就消失了。以下是我的理论:

BinaryFormatter以很小的增量从流中读取数据。它尽可能少地读取,这样它就不会意外地在序列化对象之后吞下几个字节。这意味着它正在发出的读取命令(我用Reflector验证了这一点)。

可能,每次读取blob流都会导致网络往返(或其他一些主要开销)。如果立即使用BinaryFormatter,那么您将获得数百万次往返。

缓冲首先使网络得到更有效的利用,因为读缓冲区的大小要大得多。