Каков самый быстрый способ скопировать мой массив?

Я занимаюсь обработкой файлов Wave и считываю их с диска в массив байтов. Я хочу быстро скопировать порции из этого байтового массива в другой буфер для промежуточной обработки. В настоящее время я использую что-то вроде этого:

float[] fin;
byte[] buf;
//fill buf code omitted
for(int i=offset; i < size; i++){
  fin[i-offset] = (float) buf[i];  
} 

Я чувствую, что это медленный метод, потому что в цикле for выполняется столько же вычислений, сколько в самом теле. Если бы была блочная копия, доступная на C# или каким-либо другим способом, я могу реализовать блочную копию, это было бы здорово.

Может быть, это не слишком медленно, но похоже, что для перемещения некоторых данных требуется много работы. Здесь «размер» находится между 2 ^ 10 и 2 ^ 14. Затем я передаю «плавник» библиотеке БПФ, так что это ни в коем случае не самая медленная часть кода, возможно, я ошибаюсь.

ОБНОВЛЕНИЕ РЕДАКТИРОВАТЬ: я понимаю, что микрооптимизация — это не то, на что кто-то должен тратить свое время, и я понимаю, что профилирование — лучший способ добиться ускорения в целом, но я знаю, что этот код находится на «горячем пути» и должен быть завершен в треть секунды на различных архитектурах конечного пользователя, чтобы минимизировать требования к нашей аппаратной системе. Несмотря на то, что я знаю, что следующий код БПФ займет гораздо больше времени, я ищу ускорения, где я могу их получить.

Array.Copy, конечно, выглядит красиво, я не знал об этом раньше, и я уже считаю этот Q&A успешным!


person Karl    schedule 19.02.2009    source источник


Ответы (4)


Существует также:

Array.Copy
Array.CopyTo

но будет ли это быстрее, потребуется профилирование.

Но имейте в виду, если вы сосредотачиваетесь на микрооптимизациях до такой степени, что теряете общую картину, на современных ПК эффект многоуровневого кэширования памяти, вероятно, будет больше, чем тот или иной подход к копированию.

Редактировать: Быстрая проверка в отражателе: оба вышеперечисленных метода сводятся к общей собственной реализации (хорошо).

Обратите внимание, что документы для Array.Copy охватывают допустимые преобразования типов, преобразование расширения значения -> значения, такое как byte to float, должно быть в порядке.

person Richard    schedule 20.02.2009

Взгляните на Array.Copy, это должно быть быстрее

person Sam Saffron    schedule 20.02.2009

Поскольку вы конвертируете из байта в число с плавающей запятой, вы не получите значительного ускорения. Никакой Array.Copy или разновидность memcopy не справятся с этим.

Единственным возможным выигрышем было бы «вставить» значение байта в число с плавающей запятой. Я недостаточно знаю (о реализации float), чтобы знать, будет ли это работать, и я, честно говоря, тоже не хочу знать.

person Henk Holterman    schedule 20.02.2009
comment
Да, под MS.NET Framework, я не думаю, что мы должны подсовывать биты под поплавок :) - person Karl; 20.02.2009

Я не буду ссылаться на Кнута, но профилирую ваш код. Поставьте несколько временных меток и измерьте, сколько времени это занимает. Тогда вы можете хорошо потратить свое время на оптимизацию :)

person Spence    schedule 19.02.2009