这段代码大约需要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/