.NET + Копирование большого количества трюков памяти - PullRequest
4 голосов
/ 24 сентября 2008

В былые времена использовались трюки (часто для уничтожения закадровых кадровых буферов), чтобы копировать большие куски памяти из одного места в другое.

Теперь, когда я работаю в C #, я обнаружил необходимость перемещать массив байтов (размером примерно 32 КБ) из одной области памяти в другую примерно 60 раз в секунду.

Почему-то я не думаю, что побайтовое копирование в цикле for является оптимальным.

Кто-нибудь знает хороший прием для выполнения такой работы, оставаясь при этом в чисто управляемом коде?

Если нет, я хочу сделать P / Invoking или перейти в небезопасный режим, но я бы хотел, чтобы мне оставалось управлять, если я могу по кроссплатформенным причинам.

EDIT: Некоторый код для тестирования, который я написал просто для удовольствия:

Байт за байтом: 15,6192

4 байта на цикл: 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);

1 Ответ

8 голосов
/ 24 сентября 2008

Я думаю, вы можете рассчитывать на Buffer.BlockCopy (), чтобы делать правильные вещи

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...