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);
Foi útil?

Solução

Eu acho que você pode contar com Buffer.BlockCopy () para fazer a coisa certa

http://msdn.microsoft.com/en- us / library / system.buffer.blockcopy.aspx

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top