gpt4 book ai didi

.net - FileStream 的 Write 与 WriteByte 在 IEnumerable 上的性能

转载 作者:行者123 更新时间:2023-12-04 03:05:16 26 4
gpt4 key购买 nike

我需要写一个 IEnumerable<byte> 的字节到一个文件。
我可以将它转换为数组并使用 Write(byte[])方法:

using (var stream = File.Create(path))
stream.Write(bytes.ToArray());

但是自IEnumerable不提供集合的项目计数,使用 ToArray不推荐unless it's absolutely necessary .

所以我可以迭代 IEnumerable并使用 WriteByte(byte)在每次迭代中:

using (var stream = File.Create(path))
foreach (var b in bytes)
stream.WriteByte(b);

我想知道在写入大量数据时哪个会更快。

我想使用 Write(byte[])根据数组大小设置缓冲区,因此在处理数组时会更快。

我的问题是当我只有一个 IEnumerable<byte>有 MB 的数据,哪种方法更好?将其转换为数组并调用 Write(byte[])或迭代它并调用 WriteByte(byte)每个?

最佳答案

对大量字节流进行枚举是一个给通常很便宜的事情增加大量开销的过程:将字节从一个缓冲区复制到下一个缓冲区。

通常,LINQ 样式的开销并不重要,但当涉及到在普通硬盘驱动器上每秒处理 1 亿字节时,您注意到严重的开销。这不是过早的优化。我们可以预见这将是一个性能热点,因此我们应该积极优化。

所以当你在周围复制字节时,你可能不应该依赖像 IEnumerable 这样的抽象。和 IList根本。传递数组或 ArraySegement<byte>的也包含 OffsetCount .这使您不必过于频繁地对数组进行切片。

高吞吐量 IO 的死罪之一是按字节调用一个方法。就像按字节读取和按字节写入一样。这会降低性能,因为每秒必须调用这些方法数亿次。我亲身经历过。

始终一次处理至少 4096 字节的整个缓冲区。根据您正在执行 IO 的媒体,您可以使用更大的缓冲区(64k、256k 甚至兆字节)。

关于.net - FileStream 的 Write 与 WriteByte 在 IEnumerable<byte> 上的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12545533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com