在过去的日子里,有一些技巧(通常是用于遮挡屏幕外的帧缓冲区),将大块内存从一个位置复制到另一个位置.现在我正在使用C#,我发现需要将一个字节数组(大小约为32k)从一个内存位置移动到另一个内存位置大约每秒60次.不...
                
在过去的日子里,有一些技巧(通常是用于遮挡屏幕外的帧缓冲区),将大块内存从一个位置复制到另一个位置.
现在我正在使用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/en-us/library/system.buffer.blockcopy.aspx
本文标题为:c# – .NET复制大量内存技巧
				
        
 
            
        - 在C# 8中如何使用默认接口方法详解 2023-03-29
 - c# 模拟线性回归的示例 2023-03-14
 - user32.dll 函数说明小结 2022-12-26
 - 如何使用C# 捕获进程输出 2023-03-10
 - C# 使用Aspose.Cells 导出Excel的步骤及问题记录 2023-05-16
 - Oracle中for循环的使用方法 2023-07-04
 - Unity3D实现渐变颜色效果 2023-01-16
 - WPF使用DrawingContext实现绘制刻度条 2023-07-04
 - Unity Shader实现模糊效果 2023-04-27
 - .NET CORE DI 依赖注入 2023-09-27
 
						
						
						
						
						
				
				
				
				