.NET +复制大量内存技巧

时间:2020-03-06 14:37:47  来源:igfitidea点击:

在过去,曾经使用过一些技巧(通常用于清除屏幕外的帧缓冲区),以将大块内存从一个位置复制到另一个位置。

现在,我正在使用C#,我发现需要将一个字节数组(大小约为32k)从一个内存位置每秒移动到另一个大约60次。

无论如何,我认为for循环中的逐字节复制不是最佳选择。

有谁知道在保留纯托管代码的情况下进行此类工作的好技巧?

如果不是这样,我愿意进行一些P / Invoking或者进入不安全模式,但是如果出于跨平台的原因,我想保持管理状态。

编辑:
我写的一些基准测试代码只是为了好玩:

Byte by Byte: 15.6192
  
  4 Bytes per loop: 15.6192
  
  Block Copy: 0
Byte[] src = new byte[65535];
            Byte[] dest = new byte[65535];
            DateTime startTime, endTime;

            startTime = DateTime.Now;
            for (int k = 0; k < 60; k++)
            {
                for (int i = 0; i < src.Length; i++)
                {
                    dest[i] = src[i];
                }
            }
            endTime = DateTime.Now;

            Console.WriteLine("Byte by Byte: " + endTime.Subtract(startTime).TotalMilliseconds);

            startTime = DateTime.Now;
            for (int k = 0; k < 60; k++)
            {
                int i = 0;
                while (i < src.Length)
                {
                    if (i + 4 > src.Length)
                    {
                        // Copy the remaining bytes one at a time.
                        while(i < src.Length)
                        {
                            dest[i] = src[i];
                            i++;
                        }
                        break;
                    }

                    dest[i] = src[i];
                    dest[i + 1] = src[i + 1];
                    dest[i + 2] = src[i + 2];
                    dest[i + 3] = src[i + 3];

                    i += 4;                    
                }
            }
            endTime = DateTime.Now;

            Console.WriteLine("4 Bytes per loop: " + endTime.Subtract(startTime).TotalMilliseconds);

            startTime = DateTime.Now;
            for (int k = 0; k < 60; k++)
            {
                Buffer.BlockCopy(src, 0, dest,0, src.Length);
            }
            endTime = DateTime.Now;

            Console.WriteLine("Block Copy: " + endTime.Subtract(startTime).TotalMilliseconds);

解决方案

我认为我们可以依靠Buffer.BlockCopy()做正确的事

http://msdn.microsoft.com/zh-CN/library/system.buffer.blockcopy.aspx