1

在这里,我想知道通常认为什么更快。

在序列化数据时直接写入流

using (var fs = new FileStream(file, FileMode.Create, FileAccess.Write, FileShare.None))
{
    TypeSerializer.SerializeToStream(data, fs);
}

与之前缓冲序列化数据并将所有内容一次写入流

string buffer = TypeSerializer.SerializeToString(data);
using (StreamWriter sw = new StreamWriter(file, false))
{
    sw.Write(buffer);
}

我的示例在这里使用 ServiceStack.Text,因为我对其开发人员的想法特别感兴趣,但我想这也适用于所有其他序列化方法。

我也知道 FileStream 使用内部缓冲区,但我不太确定在序列化时是否可以信任它,无论出于何种不太可能的原因,它比磁盘 IO 慢 :)

4

1 回答 1

0

这真的取决于。

如果您正在谈论大量数据,则将其加载到内存中会花费很多。甚至要花很多钱(更不用说 GC 需要花费多少才能摆脱这些临时数据)——这是一种浪费。

在服务器端应用程序中,将所有数据加载到内存中并一次性写入将是一个很大的吞吐量禁忌。当服务器受到压力时,这可能是性能良好的应用程序与根本不工作的应用程序之间的区别。

一般来说,流媒体是要走的路。

就单次调用而言,它实际上取决于数据的大小、缓冲区、IO 延迟等。需要进行测试以找到神奇的数字(块大小)。

关于刷新策略(写入的内部缓冲区),您始终可以通过在流本身或包装 StreamWriter 上调用 FlushMethod 来确保它保持不变。

希望这会有所帮助,Ofir。

于 2014-06-06T13:14:39.303 回答