Объединение массивов байтов

456
23 января 2017, 17:14

Есть необходимость присоединять один массив байт к другому (много раз подряд).

Для этого я нашел пока 2 варианта:

  1. объединение через arr.CopyTo(..); либо Array.Copy(...);
  2. объединение через StreamWriter (то есть пишем байты в поток, потом все вместе считываем)

Может, есть другие способы?

Линковский Concat, думаю, будет долго выполняться.

Про theList.AddRange() я вообще молчу.

Есть ли еще способы?

Важно быстродействие.

UPD:

Если я делаю так

for(var i=0;i<100;i++)
{
  var sendBuff = Encoding.Unicode.GetBytes(i.ToString());
  theNetwork.Write(sendBuff, 0, sendBuff.Length);
}

То на входе вот таким способом

var resp = new byte[0];
var partSize = 1024;
do
{
    var subBuff = new byte[partSize];
    var bytesCount = client.GetStream().Read(subBuff, 0, partSize);
    var temp = resp;
    resp = new byte[resp.Length + bytesCount];
    temp.CopyTo(resp, 0);
    Array.ConstrainedCopy(subBuff, 0, resp, temp.Length, bytesCount);
} while (client.GetStream().DataAvailable);
var s = Encoding.Unicode.GetString(resp);
Console.WriteLine(s);

я рассчитываю получить строку

0123456789101112...99

а вместо этого она обрывается на 40-50 где-то

То есть чтобы получить остальные данные, мне снова нужно снова запустить цикл приема. Но вот вопрос, а что, если отдающая сторона одновременно отдает с разных потоков разную информацию? Тогда я могу получить что-то вроде

012345678910еще какая то хрень1112...99

Но, TCP обещает доставить пакеты в том порядке, в котором они были отправлены. поэтому, если я передам один объект целиком, он и придет целиком. Поэтому мне нужно отправлять цельный массив

Answer 1

Как вариант, можно пометить блок кода, как Unsafe и ручками через указатели манипулировать массивом. Я думаю, что это самый быстрый вариант.

Вот тут уже провели тесты, которые подтверждают мои слова:

http://stackoverflow.com/questions/5099604/any-faster-way-of-copying-arrays-in-c

READ ALSO
Можно ли в произвольном тексте найти все, что закодировано в Base64?

Можно ли в произвольном тексте найти все, что закодировано в Base64?

Например, имеется произвольный текст, где могут встречаться последовательности, которые закодированы в base64

266
Конвертирование клавиш в ToUnicodeEx

Конвертирование клавиш в ToUnicodeEx

Как конвертировать клавиатурных хук который сможет понимать все клавиши и выводить нужный символ?!

331
.NET Производительность ReadAllText и SetBackgroundImage

.NET Производительность ReadAllText и SetBackgroundImage

Есть у меня подозрения что ReadAllText работает неприемлемо плохо, дело в том что формы у меня появляются с изменением прозрачности от нуля к единице,...

331
Наложение текстуры на полигон

Наложение текстуры на полигон

Как на полигон наложить текстуру по URL или bitmap в фреймворке SharpGL?

429