Какой самый быстрый способ скопировать мой массив? - PullRequest
4 голосов
/ 20 февраля 2009

Я занимаюсь обработкой файлов 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. Затем я передаю «плавник» библиотеке FFT, так что это ни в коем случае не самая медленная часть кода, возможно, я лаю не на том дереве.

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

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

Ответы [ 4 ]

12 голосов
/ 20 февраля 2009

Также есть:

Array.Copy
Array.CopyTo

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

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

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

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

3 голосов
/ 20 февраля 2009

Посмотрите на Array. Скопируйте это должно быть быстрее

3 голосов
/ 20 февраля 2009

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

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

1 голос
/ 20 февраля 2009

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

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