.NET + Das Kopieren von großen Mengen an Speicher Tricks
-
02-07-2019 - |
Frage
Zurück in den alten Tagen gab es Tricks (oft für Off-Screen-Framebuffer Blitten), große Teile des Speichers von einem Ort zum anderen kopieren.
Nun, da ich in C # gerade arbeite, habe ich das Bedürfnis, finde eine Reihe von Bytes (ca. 32k in der Größe) von einem Speicherplatz zu einem anderen etwa 60 Mal pro Sekunde zu bewegen.
Irgendwie glaube ich nicht ein Byte für Byte Kopie in einem for-Schleife ist hier optimal.
Kennt jemand einen guten Trick, um dies irgendwie Arbeit zu tun, während sie noch in rein verwalteten Code zu bleiben?
Wenn nicht, ich bin bereit, etwas zu tun P / oder in unsicheren Modus aufrufen, aber ich möchte es geschafft, bleiben, wenn ich kann für Cross-Plattform-Gründen.
EDIT: Einige Benchmarking Code, den ich schrieb bis nur zum Spaß:
Byte für Byte: 15,6192
4 Bytes pro Schleife: 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);
Lösung
Ich glaube, Sie auf Buffer.BlockCopy zählen können (), um das Richtige zu tun
http://msdn.microsoft.com/en- us / library / system.buffer.blockcopy.aspx