Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.NET MemoryStream-我应该设置容量吗?_.net_Memorystream - Fatal编程技术网

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

.NET MemoryStream-我应该设置容量吗?,.net,memorystream,.net,Memorystream,这可能是一个非常简单的问题,我想我所追求的是宣布一个新的MemoryStream的最佳实践 以下两个样本之间有什么区别: MemoryStream myStream=新的MemoryStream(0x10000) 或 MemoryStream myStream=newmemoryStream() 显然,我知道第一个示例设置了流的初始容量。但是,这两个都具有自动调整大小的容量 我知道为什么我应该使用一种方法而不是另一种方法吗?如果您已经知道要存储多少字节,那么在构造函数中显式设置它似乎是正确的-一

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

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

MemoryStream myStream=新的MemoryStream(0x10000)

MemoryStream myStream=newmemoryStream()

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


我知道为什么我应该使用一种方法而不是另一种方法吗?

如果您已经知道要存储多少字节,那么在构造函数中显式设置它似乎是正确的-一般来说,我会尽可能简单,只使用默认构造函数而不使用任何参数,在维护代码时,您还需要阅读和理解另外一件事。

在第一种情况下,当所需大小小于传递给构造函数的值时,您可以避免自动调整结构大小的成本。

如果您知道需要的大小,我相信显式设置大小将提高性能,因为框架不必多次调整流的大小。

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

重新调整内存流的大小会带来开销。如果您知道或以其他方式对需要存储在内存流中的预期大小有合理的猜测,那么您将希望使用该大小作为初始容量。否则,将使用默认大小0,并将随着数据的添加而调整大小。

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


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

当重新调整内存流的大小时,它会创建一个新大小的字节[]缓冲区。如果频繁执行此操作,根据缓冲区大小,您可能会遇到以下两个问题之一: 1.系统抛出OurOfMemoryException
2.堆中的所有内存都会碎片化。它会带来不可预测的后果。例如,System.Drawing.Bitmap的构造函数出现“Parameter is not valid”(参数无效)消息失败。

FYI,MemoryStream是.NET的一部分,而不是C的一部分35; Good point没有真正思考,这显然适用于VB和其他.NET语言。这只是一个提醒,如果您没有在构造函数中设置它,您仍然可以调用它,使其在以后增长。“[…]将永远不需要增加。”-我感觉这是错误的,如果有人读过这篇文章。是的,只有将字节数组传递给构造函数时,MemoryStream才不可调整大小。请参阅“使用指定的可扩展容量初始化MemoryStream类的新实例”。默认大小真的是4096吗?好久不见了。我不知道我从哪里得到了4096的初始尺寸。我现在似乎无法证实这一点。已编辑.net 4的.interest factoid,使用ILSpy,我发现它的初始大小为0,但当您写入第一个字节时,它将调用最小大小为256的私有函数
EnsureCapacity
。在最初的256次增长之后,每一次增长都会使当前容量翻倍。