NET + copiar grandes quantidades de truques de memória
-
02-07-2019 - |
Pergunta
De volta aos velhos tempos, havia truques usados ??(muitas vezes para blitting fora da tela framebuffers), para copiar grandes blocos de memória de um local para outro.
Agora que eu estou trabalhando em C #, eu encontrei a necessidade de passar uma matriz de bytes (cerca de 32k em tamanho) de um local de memória para outro cerca de 60 vezes por segundo.
De alguma forma, eu não acho que um byte por byte cópia em um loop é ótimo aqui.
Alguém sabe um bom truque para fazer isso kinda de trabalho enquanto ainda ficar em código puramente gerenciado?
Se não, eu estou disposto a fazer alguns P / Invocando ou entrar em modo inseguro, mas eu gostaria de ficar conseguiu se eu puder, por razões de plataforma cruzada.
EDIT: Alguns códigos de benchmarking Eu escrevi apenas para se divertir:
byte por byte: 15,6192
4 bytes por loop: 15,6192
Bloco de cópia: 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);
Solução
Eu acho que você pode contar com Buffer.BlockCopy () para fazer a coisa certa ??p>
http://msdn.microsoft.com/en- us / library / system.buffer.blockcopy.aspx