为什么复制一个流然后使用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
以很小的增量从流中读取数据。它让尽可能少地读取,这样它就不会意外地在序列化对象之后吞下几个字节。这意味着它正在发出吨的读取命令(我用Reflector验证了这一点)。
可能,每次读取blob流都会导致网络往返(或其他一些主要开销)。如果立即使用BinaryFormatter
,那么您将获得数百万次往返。
缓冲首先使网络得到更有效的利用,因为读缓冲区的大小要大得多。