.NET + Трюки с копированием больших объемов памяти

StackOverflow https://stackoverflow.com/questions/124117

  •  02-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

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

Редактировать:Кое-какой код для бенчмаркинга, который я написал просто для развлечения:

Байт за байтом:15.6192

4 Байта на цикл:15.6192

Блочная копия: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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top