【发布时间】:2009-09-07 15:12:20
【问题描述】:
Array.Copy 和Buffer.BlockCopy 都做同样的事情,但BlockCopy 是针对快速字节级原始数组复制,而Copy 是通用实现。我的问题是——在什么情况下你应该使用BlockCopy?您应该在复制原始类型数组时随时使用它,还是只在为性能编码时才使用它?使用Buffer.BlockCopy 而不是Array.Copy 有什么本质上的危险吗?
【问题讨论】:
-
别忘了
Marshal.Copy:-)。好吧,将Array.Copy用于引用类型、复杂值类型,如果类型没有改变,则Buffer.BlockCopy用于值类型、字节数组和字节魔法之间的“转换”。前任如果您知道自己在做什么,那么与StructLayout的组合非常强大。至于性能,似乎对memcpy/cpblk的非托管调用是最快的 - 请参阅code4k.blogspot.nl/2010/10/…。 -
我用
byte[]做了一些基准测试。发布版本没有区别。有时Array.Copy,有时Buffer.BlockCopy(稍微)更快。 -
刚刚在下面发布的新综合答案。请注意,在缓冲区大小较小的情况下,显式循环复制通常是最好的。
-
我不认为他们总是做同样的事情 - 例如,您不能使用 Array.Copy 将 Ints 数组复制到 Bytes 数组中
-
Array.Copy是一个专门的版本——例如它只能复制相同等级的数组。