直接序列化到文件流或缓冲区之前

时间:2013-05-03 20:13:25

标签: c# performance buffer servicestack filestream

我想知道什么通常被认为更快。

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

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

VS。在之前缓冲序列化数据并立即将所有内容写入流

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

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

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

1 个答案:

答案 0 :(得分:0)

这真的取决于。

如果您正在谈论大量数据,那么将其加载到内存将花费。甚至成本太高(更不用说GC必须多少才能摆脱这些临时数据) - 这是一种浪费。

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

作为一般概念,Streaming是要走的路。

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

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

希望这有帮助, 奥菲尔。