- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在研究一些 .NET 功能(即管道、内存和数组池)以实现高速文件读取/解析。在使用 Array.Copy
、Buffer.BlockCopy
和 ReadOnlySequence.CopyTo
时,我遇到了一些有趣的事情。 IO 管道以 byte
形式读取数据,我正在尝试有效地将其转换为 char
。
在使用 Array.Copy
时,我发现我可以从 byte[]
复制到 char[]
和编译器(和运行时)非常乐意这样做。
char[] outputBuffer = ArrayPool<char>.Shared.Rent(inputBuffer.Length);
Array.Copy(buffer, 0, outputBuffer, 0, buffer.Length);
此代码按预期运行,但我确定此处未正确处理一些 UTF 边界情况。
我的好奇心来自 Buffer.BlockCopy
char[] outputBuffer = ArrayPool<char>.Shared.Rent(inputBuffer.Length);
Buffer.BlockCopy(buffer, 0, outputBuffer, 0, buffer.Length);
outputBuffer
的结果内容是垃圾。例如,buffer
的示例内容为
{ 50, 48, 49, 56, 45 }
复制后outputBuffer
的内容为
{ 12338, 14385, 12333, 11575, 14385 }
我只是好奇 CLR 内部“幕后”发生了什么导致这 2 个命令输出如此不同的结果。
最佳答案
Array.Copy() 对元素类型更智能。它将尝试尽可能使用 memmove() CRT 函数。但是会回退到一个循环,在它不能复制每个元素时。根据需要转换它们,它考虑装箱和原始类型转换。因此源数组中的一个元素将成为目标数组中的一个元素。
Buffer.BlockCopy() 跳过所有这些并使用 memmove() 爆炸。不考虑转换。这就是为什么它可以稍微快一点的原因。并且更容易误导您有关数组内容的信息。请注意,utf8 编码的字符数据在该数组中是可见的,12338 == 0x3032 = "2 ",14385 = 0x3831 = "18",等等。使用 Debug > Windows > Memory > Memory 1 更容易看到。
也许值得注意的是,这种类型强制是一个特性。假设您通过套接字或管道接收到一个 int[] 但数据在 byte[] 缓冲区中。迄今为止最快的方法。
关于c# - Buffer.BlockCopy vs Array.Copy 好奇心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51810410/
假设我有一个字节数组: byte[] input = { 0xFF, 0xFc, 0x00, 0x00 } 您可以使用 Buffer.BlockCopy 将字节从一个数组复制到另一个数组,无论类型如何
我有两种列表:一种是带有 int 元素的列表,另一种是带有 bool 元素的列表。要将这些列表传递给服务器,我必须执行以下操作: using(MemoryStream m = new MemorySt
C#中System命名空间下的BlockCopy具有以下参数: public static void BlockCopy( Array src, int srcOffset, Array dst
背景 我正在编写一个C#程序,它通过数据采集来收集一些信息。它非常复杂,所以我不会在这里详细介绍它,但数据采集是连续发起的,然后在异步线程上,我的程序定期访问采集缓冲区并从中获取 100 个样本。然后
对于引用类型的数组,是否有“Buffer.BlockCopy”的安全替代方案? 编辑: 我的目的是在不同等级的数组之间移动数据,例如从 Object[] 到 Object[,] 而无需遍历数组。 Bu
VB 的 Buffer.BlockCopy 的 Java 等价物是什么? for (int i = 0; i < num5; i++) { int[] dst = new int[9];
我有一个问题已经困扰我好几天了。我曾尝试用谷歌搜索这个问题,但到目前为止还没有找到任何解决方案,甚至没有一个人遇到同样的问题。 似乎 C# 方法 System.Buffer.BlockCopy 给您留
复制一个字节 block 时,哪个性能更好? 最佳答案 Buffer.BlockCopy 非常优化 - 它基本上是对原始内存副本的包装;所以它应该非常快(并且避免弄乱指针和 unsafe 代码)。它应
Array.Copy和 Buffer.BlockCopy两者都做同样的事情,但 BlockCopy旨在快速字节级原始数组复制,而 Copy是通用实现。我的问题是 - 在什么情况下你应该使用 Block
背景 I have to clear fixed-length managed byte arrays (ex: byte[4096]) very frequently. 我的问题是寻找一个适用于通用
我一直在研究一些 .NET 功能(即管道、内存和数组池)以实现高速文件读取/解析。在使用 Array.Copy、Buffer.BlockCopy 和 ReadOnlySequence.CopyTo 时
我正在将一个 .Net 应用程序移植到 Objective-C,并且需要添加一段纯 C 代码。我有一个字节(或字符)数组,需要将一定数量的带偏移量的字节复制到不同的字符数组。在 .Net 上,这是 B
我需要在 Java 中将 double 组序列化为 base64。我有以下 C# 方法 public static string DoubleArrayToBase64( double[] dValu
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我是一名优秀的程序员,十分优秀!