В былые времена использовались уловки (часто для копирования закадровых буферов кадра) для копирования больших кусков памяти из одного места в другое.
Теперь, когда я работаю на C#, я обнаружил необходимость перемещать массив байтов (размером примерно 32 КБ) из одного места памяти в другое примерно 60 раз в секунду.
Почему-то я не думаю, что побайтовое копирование в цикле for здесь оптимально.
Кто-нибудь знает хороший трюк для выполнения такой работы, оставаясь при этом в чисто управляемом коде?
Если нет, я хочу выполнить P / Invoking или перейти в небезопасный режим, но я бы хотел, чтобы управление оставалось управляемым, если это возможно, по кросс-платформенным причинам.
Обновлено: Код для тестирования производительности, который я написал просто для удовольствия:
Byte by Byte: 15.6192
4 Bytes per loop: 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);
Да, использование тайминга с использованием Now довольно бесполезно, если только вы не сделаете намного больше повторений, чем здесь, чтобы увеличить общее использованное время. Now () срабатывает только каждые 64 секунды в большинстве систем, поэтому все ваши тесты показывают, что первые два составляют> 8 мс, а последние <8 мс.





Я думаю, вы можете рассчитывать на Buffer.BlockCopy (), чтобы делать правильные вещи
http://msdn.microsoft.com/en-us/library/system.buffer.blockcopy.aspx
System.Diagnostics.Stopwatch, очень классный класс, который может помочь.