将非托管内存复制到托管字节数组

时间:2011-09-23 06:21:07

标签: c# performance marshalling unmanaged-memory

我需要将非托管内存读入托管字节数组。

为此,我有一个对非托管内存的IntPtr引用,以及一个代表我感兴趣的非托管内存大小的长度。

我使用以下代码将其读入托管字节数组。

            byte[] pixelDataArray = new byte[pixelDataLength];
            for (int i = 0; i < pixelDataLength; i++) {
                pixelDataArray[i] = Marshal.ReadByte(pixelData, i);
            }

然而,这导致非常差的性能。使用256KB非托管内存调用此方法1000次,需要7秒以上。我认为必须有一种更有效的方法来做到这一点。

我无法使用Marshal.PtrToStructure,因为我不知道需要预先阅读的内存大小。

关于如何改进此功能的性能的任何想法?

2 个答案:

答案 0 :(得分:6)

而不是循环尝试copying整个块:

Marshal.Copy(pixelData, pixelDataArray, 0, pixelDataLength);

答案 1 :(得分:3)

使用Marshal.Copy()

byte[] pixelDataArray = new byte[pixelDataLength];
Marshal.Copy(pixelData, pixelDataArray, 0, pixelDataArray.Length);