9

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

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;
}

为什么?

4

1 回答 1

5

所以你说当数据库被排除在等式之外时问题就消失了。这是我的理论:

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

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

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

于 2013-01-09T13:23:01.557 回答