.NET MemoryStream - 我应该设置容量吗?

时间:2011-01-05 21:33:41

标签: .net memorystream

这可能是一个非常简单的问题,我认为我所追求的是宣布新MemoryStream的最佳实践

以下2个样本之间有什么区别:

MemoryStream myStream = new MemoryStream(0x10000);

MemoryStream myStream = new MemoryStream();

显然,我知道第一个例子设置了流的初始容量。但是,这两者都具有可自动调整大小的容量。

我有什么理由说我应该使用一种方法而不是另一种方法?

7 个答案:

答案 0 :(得分:25)

与重新调整内存流大小相关的开销。如果您知道或以其他方式合理猜测需要存储在内存流中的预期大小,您将需要使用该大小作为初始容量。否则,将使用默认大小0,并在添加数据时调整大小。

答案 1 :(得分:7)

老问题我知道,但只是为了记录;

如果您正在处理大量数据(在我的情况下超过1 GB),设置初始容量是使其在可接受的时间段内工作而不会终止服务器的唯一方法。在这种情况下,重新调整开销是至关重要的。

答案 2 :(得分:2)

如果你知道你需要的大小,我相信明确地设置大小会提高性能,因为框架不必多次调整流的大小。

答案 3 :(得分:1)

如果您已经确切地知道要存储的字节数,那么在构造函数中显式设置它似乎是正确的 - 通常我会尽可能地保持它并且只使用没有参数的默认构造函数,它只是一个在维护代码时必须阅读和理解的事情。

答案 4 :(得分:1)

如果您知道您将需要0x10000字节的数据,则第一个代码段会确保将内存流初始化为此大小,并且永远不需要增加。可能会有一些性能影响,具体取决于类如何管理下面的缓冲区以及它是否需要连续的内存块;根据具体情况,调整大小可能是一项昂贵的操作。

答案 5 :(得分:0)

在第一种情况下,您需要避免自动结构调整大小,而所需的大小小于传递给构造函数的值。

答案 6 :(得分:0)

当重新调整内存流的大小时,它会创建一个新大小的byte []缓冲区。如果经常执行此操作,您可能会遇到两个问题之一,具体取决于缓冲区大小: 1.系统抛出OurOfMemoryException 2.堆中的所有内存都会碎片化。它带来了不可预测的后果。例如,System.Drawing.Bitmap的构造函数失败,并显示“参数无效”消息。