【发布时间】:2010-09-12 13:16:45
【问题描述】:
在过去,曾使用过一些技巧(通常用于对屏幕外帧缓冲区进行 blitting),将大块内存从一个位置复制到另一个位置。
现在我使用 C# 工作,我发现需要将字节数组(大约 32k 大小)从一个内存位置移动到另一个内存位置,大约每秒 60 次。
不知何故,我不认为 for 循环中的逐字节复制在这里是最佳的。
有没有人知道在仍然停留在纯托管代码中的同时完成此类工作的好技巧?
如果没有,我愿意做一些 P/Invoking 或进入不安全模式,但出于跨平台原因,如果可以的话,我希望保持管理。
编辑: 我写的一些基准代码只是为了好玩:
逐字节: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);
【问题讨论】:
-
System.Diagnostics.Stopwatch,非常酷的课程,可以提供帮助。
-
是的,使用 Now 的计时是相当无用的,除非你做比这里更多的重复,以使总时间增加。 Now() 在大多数系统上仅每 64 秒计时一次,因此您的所有基准都确定前两个大于 8 毫秒,最后一个小于 8 毫秒。
标签: c# .net memory-management