Методы производительности C# получения данных из сокета?

Давайте предположим, что у нас есть простой интернет-сокет, и он собирается отправить 10 мегабайтов (потому что я хочу проигнорировать проблемы памяти) случайных данных через. Есть ли какое-либо различие в производительности или метод лучшей практики, который нужно использовать для получения данных? Данные окончательного результата должны быть представлены байтом []. Да я знаю запись, что произвольный объем данных к памяти плох, и если бы я загружал большой файл, то я не сделал бы его как это. Но поскольку польза аргумента позволяют нам проигнорировать, что и предполагают, что это - небольшой объем данных. Я также понимаю, что узкое место здесь является, вероятно, не управлением памятью, а скорее получением сокета. Я просто хочу знать то, что было бы наиболее эффективным способом получения данных.

Несколько изворотливых путей могут думать:

  1. Имейте Список и буфер, после того, как буфер полон, добавьте его к списку и в списке конца. ToArray () для получения байта []

  2. Запишите буфер в поток памяти после его полной конструкции байт [] потока. Длина и считала все это в него для получения байта [] вывод.

Существует ли более эффективный/лучше способ сделать это?

5
задан Luke Girvin 26 May 2017 в 14:54
поделиться

3 ответа

Просто напишите в MemoryStream , а затем вызовите ToArray - это создаст объект подходящего размера байтовый массив для вас. По сути, это то, на что в любом случае будет похож List , но использование MemoryStream будет намного проще.

3
ответ дан 15 December 2019 в 06:21
поделиться

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

-1
ответ дан 15 December 2019 в 06:21
поделиться

Какова кодировка ваших данных? это простой ASCII или что-то еще, например UTF-8 / Unicode?

если это простой ASCII, вы можете просто выделить StringBuilder () требуемого размера (получить размер из заголовка ContentLength ответа ) и продолжайте добавлять свои данные в построитель после преобразования их в строку с помощью Encoding.ASCII.

Если это Unicode / UTF8, то у вас проблема - вы не можете просто вызвать Encoding..GetString (buffer, 0, bytesRead) для прочитанных байтов, потому что bytesRead может не составлять фрагмент логической строки в этой кодировке. В этом случае вам нужно будет поместить в буфер все тело объекта в память (или в файл), затем прочитать этот файл и декодировать его, используя кодировку.

0
ответ дан 15 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: