gpt4 book ai didi

c# - .NET + 复制大量内存技巧

转载 作者:太空狗 更新时间:2023-10-30 00:37:05 25 4
gpt4 key购买 nike

在过去,使用了一些技巧(通常用于 blitting offscreen framebuffers),将大块内存从一个位置复制到另一个位置。

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

不知何故,我不认为 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 + 复制大量内存技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/124117/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com