在C#中,在性能方面复制位的最佳方法是什么?

4
什么是在C#中将位从Int复制到byte数组的最快方法?
我有几个int,并且我需要将它们(有时全部,有时部分)按顺序逐位复制到byte[]中...
我需要这个过程尽可能高效(例如,避免在过程中创建新的byte array,因为我了解BitConverter等)。

1
创建新的字节数组有什么问题吗?您是否已经测量并验证了这是一个重大的性能问题,或者您正在解决可能不存在的问题?您是否尝试过多种方法?结果如何? - D Stanley
1
@DStanley 特别是考虑到我们正在讨论复制位,这表明首先需要一个新的字节数组... - Kateract
1
你可以始终“手动”获取组件字节:var b0=val&0xff; var b1=(val>>8)&0xff; var b2=(val>>16)&0xff; var b3=(val>>24)&0xff; 并随意处理它们。 - spender
1个回答

3

避免在每次调用时创建新的byte[]数组的一种方法是在MemoryStream上创建一个BinaryWriter,将您的整数写入其中,然后通过访问MemoryStream的缓冲区一次性获取所有结果:

var buf = new byte[400];
using (var ms = new MemoryStream(buf))
using (var bw = new BinaryWriter(ms)) {
    for (int i = 0 ; i != 100 ; i++) {
        bw.Write(2*i+3);
    }
}
// At this point buf contains the bytes of 100 ints

1
由于流的接口,它需要创建至少一个字节数组作为缓冲区。 - Nick Mertin
@MagikM18,您能具体说明一下吗?我正在将缓冲区buf传递给MemoryStream,我可以继续重复使用相同的流或相同的缓冲区。 - Sergey Kalinichenko
1
这是它将用于写入流的函数:https://msdn.microsoft.com/zh-cn/library/system.io.stream.write(v=vs.110).aspx 因为它将数据作为字节数组,所以必须创建另一个数组。 - Nick Mertin
@MagikM18 我明白你的意思。在参考实现中,BinaryWriter 会先创建一个大小为16的缓冲区,然后不断重复使用它。可以在源代码中看到名为 _buffer 的字段。 - Sergey Kalinichenko
好的,我也刚看到这个。 - Nick Mertin

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