Это вопрос производительности, поэтому: измерьте его!
Стоит отметить, что для измерения производительности в .NET вы хотите сделать сборку релиза и запустить без отладчик подключен (это позволяет оптимизировать JIT).
Стоит прокомментировать ответ Джодрелла: использование AsParallel
интересно, но стоит проверить, стоит ли его раскручиватьЭто.(Предположение - измерьте его, чтобы подтвердить: преобразование байта в короткое должно быть чрезвычайно быстрым, поэтому, если данные буфера поступают из общей памяти, а не из кеша ядра, большая часть ваших затрат, вероятно, будет заключаться в передаче данных, а не в их обработке.)1010 *
Также я не уверен, что ToArray
подходит.Во-первых, он может не иметь возможности создавать массив правильного размера напрямую, поскольку из-за изменения размера массива он будет очень медленным.Кроме того, он всегда выделяет массив - который сам по себе не медленный, но добавляет стоимость GC, которая вам почти наверняка не нужна.
Редактировать: На основеВаш обновленный вопрос, код в оставшейся части этого ответа не может быть использован напрямую, так как формат данных отличается.И сама техника (петля, безопасная или небезопасная) не такая быстрая, как та, которую вы можете использовать.Подробности смотрите в моем другом ответе.
Итак, вы хотите предварительно выделить свой массив.Где-то в вашем коде вам нужен такой буфер:
short[] shorts = new short[_buffer.Length];
А затем просто скопируйте из одного буфера в другой:
for(int i = 0; i < _buffer.Length; ++i)
result[i] = ((short)buffer[i]);
Это должно быть очень быстро, и JITдолжен быть достаточно умным, чтобы пропустить одну, если не обе проверки границ массива.
И вот как вы можете сделать это с небезопасным кодом: (Я не проверял этот код, но он должен быть примерно правильным)
unsafe
{
int length = _buffer.Length;
fixed(byte* pSrc = _buffer) fixed(short* pDst = shorts)
{
byte* ps = pSrc;
short* pd = pDst;
while(pd < pd + length)
*(pd++) = (short)(*(ps++));
}
}
Теперь небезопасная версия имеет недостаток, заключающийся в требовании /unsafe
, а также она может на самом деле быть медленнее , поскольку она не позволяет JIT выполнять различные оптимизации.Еще раз: измерим .
(Также вы, вероятно, сможете увеличить производительность, если попробуете некоторые перестановки на приведенных выше примерах. Измерьте .)
Наконец: Вы уверены, что хотите, чтобы преобразование было (short)sample
?Разве это не должно быть что-то вроде ((short)sample-128)*256
, чтобы перевести его из неподписанного в подписанное и расширить его до правильной ширины в битах? Обновление: кажется, я ошибся в формате здесь, см. Мой другой ответ