这段代码大约需要8秒钟,而包含大约65K的流来自数据库中的Blob。

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以很小的增量从流中读取。它必须读得尽可能少,以便不会意外地吞下序列化对象之后的几个字节。这意味着它发出大量的读取命令(我已通过Reflector进行了验证)。

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

缓冲首先导致网络被更有效地利用,因为读取缓冲区的大小要大得多。

关于c# - 为什么复制流然后使用BinaryFormatter反序列化比反序列化更快,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14232041/

10-12 12:37