性能:使用BinaryReader在MemoryStream上读取字节数组,还是直接读取?

4
我想知道在使用一个从字节数组(byte[])创建的MemoryStream上使用BinaryReader是否会显著降低性能。
我有一些二进制数据需要读取,我将其作为字节数组获取。目前我正在决定两种方法来读取数据,并相应地实现许多读取方法。每次读取操作后,我需要在读取数据之后的位置,因此我考虑使用BinaryReader。第一种非BinaryReader的方法:
object Read(byte[] data, ref int offset);

第二种方法:
object Read(BinaryReader reader);

这样的Read()方法会被频繁调用,连续读取相同的数据,直到所有数据都被读取。

因此,使用BinaryReader更加自然,但对性能有很大影响吗?

2个回答

2
你每次调用Read(byte[])方法都会产生相当数量的垃圾。MemoryStream会产生40个字节,我在BinaryReader中停止计算时已经有64个字节了。虽然Dispose通常也会被使用,但它并没有做任何事情。从你的问题中无法确定这些开销是否重要。
我个人更喜欢使用Read(BinaryReader)的重载,不仅因为它更有效率,而且还提供了改变数据源的灵活性。现在它不再需要一个byte[],你可以从FileStream或NetworkStream中获取数据。

不仅是方法的签名。在第一种方法中,我会在数组的字节上使用OR和移位操作。因此没有垃圾。是否仍然更喜欢使用BinaryReader - Daniel A.A. Pelsmaeker
嗯,你也可以使用BinaryReader读取byte[],并进行OR和shift操作,直到你需要的程度。获取一个比MS + BR的总和更大的byte[]将是平衡点。再次强调,没有足够的信息来做出决定。这种位操作可能会成为重要的维护难题。请查看BinaryFormatter。 - Hans Passant

-1
如果使用BinaryReader更自然,请使用它。我非常怀疑与从数组中读取相比,没有任何明显的性能损失。

你为什么怀疑呢?我需要用这种方式处理大量的数据。虽然使用BinaryReader肯定更容易(因为我可以使用ReadUInt32()等方法),但这真的是最好的选择吗? - Daniel A.A. Pelsmaeker
1
@Virtlink,请进行一项小测试并对其进行基准测试。然后决定使用Reader是否会影响性能。 - Mikael Svenson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接