【问题标题】:Stream's capacity vs length流的容量与长度
【发布时间】:2014-02-27 01:08:33
【问题描述】:

当我将一些流写入一个新的内存流时,内存流的长度和容量一开始都设置为0,并随着写入过程而增长。但在某些时候,容量的增长速度超过了长度。
写入操作完成后,我得到了正确的长度(与原始输入流的长度相同),但容量更大。
对吗?
他们不应该是一样的吗?
我找不到任何关于它的信息

【问题讨论】:

标签: c# stream copy memorystream capacity


【解决方案1】:

他们不应该是一样的吗?

没有——或者至少,不一定。这基本上与List<T> 的容量与计数(或StringBuilder 就这一点)相同。这个想法是,为了最大限度地减少复制的次数,当您需要增加容量时,您会显着增加它 - 而不仅仅是一次一个字节。例如,一种策略是“最少 16 个字节,并在需要时将容量翻倍。”

在您完成一些写入操作之后,流如何知道您已完成?您真的希望它必须复制整个内容才能再写入一个字节吗?

基本上,权衡是内存与速度:容量越大,副本之间的写入速度就越快。

【讨论】:

  • 我的缓冲区大小是 8192,所以在 while 循环内的每个“Write”之后,长度变为 8192,然后是 16384,依此类推。容量首先是 8192、16384 等,但在某些时候它们会停止以相同的速度增长
  • 感谢您的解释。那么我需要提前设置还是保持这种方式?
  • @user990635:是的——如果每次超过容量时容量都会翻倍,我不会感到惊讶。因此,在 3 次写入之后,您的长度可能为 24K,容量为 32K。然后第四次写入不需要更多的容量,所以它更快,你最终得到了 32K 的长度和 32K 的容量。然后第五次写入需要更多容量,因此它可能会翻倍——长度为 40K,容量为 64K。然后,您还有另外三个不需要副本的写入。
  • @user990635:如果您知道要写入多少数据,请将其设为初始容量。如果你不这样做,就让它自己管理它 - 这在空间和时间上都会降低效率,但它仍然应该工作
  • 我知道输入流的长度(我正在复制),所以这将与容量一样好,对吧?
猜你喜欢
  • 2020-09-19
  • 1970-01-01
  • 2013-01-02
  • 2016-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-16
  • 1970-01-01
相关资源
最近更新 更多