在过去的日子里,有一些技巧(通常是用于遮挡屏幕外的帧缓冲区),将大块内存从一个位置复制到另一个位置.
现在我正在使用C#,我发现需要将一个字节数组(大小约为32k)从一个内存位置移动到另一个内存位置大约每秒60次.
不知何故,我不认为for循环中的逐字节副本在这里是最佳的.
有没有人知道在保持纯托管代码的同时做这种工作的好方法?
如果没有,我愿意做一些P/Invoking或进入不安全模式,但如果我可以出于跨平台原因,我想保持管理.
编辑:我写的一些基准测试代码只是为了好玩:
字节Byte:15.6192
每个循环4个字节:15.6192
阻止复制: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);
Lou Franco.. 8
我认为你可以指望Buffer.BlockCopy()做正确的事情
http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx
我认为你可以指望Buffer.BlockCopy()做正确的事情
http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx