2013-05-10 4 views
2

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

Множество примеров, которые я видел, используют 256. Почему?

int byteSize = 256; 

TcpListener server = new TcpListener(IPAddress.Any, 9999); 
server.Start(); 
Byte[] bytes = new Byte[byteSize]; 

TcpClient client = server.AcceptTcpClient(); 

NetworkStream stream = client.GetStream(); 
int i = 0; 

while ((i = stream.Read(bytes, 0, bytes.Length)) != 0) 
{ 
    // Do stuff with the stream 
} 
+0

Имена 'bytesSize' или' bufferSize' будут более понятными. –

ответ

2

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

Это не так важно, но 256 находится на нижнем конце. Очень общий размер буфера ввода-вывода составляет 4096 байт. Это волшебное число в Windows, размер страницы памяти. Несмотря на то, что буфер будет точно разбиваться на одну страницу только случайно.

+0

Итак, чтобы упростить: Lower = Less performance, Higher = Больше использования памяти? – CathalMF

+2

Да. Я не могу публиковать короткие ответы, поэтому они преобразуются в комментарии. –

0

Все, что вы установите его в соответствии с вашим кодом i это фактические байты, прочитанные из сокета, поэтому byteSize не поможет вам, если i довольно много меньше, чем byteSize.

Внутри вашего while вы должны проверить, если i меньше, что byteSize и если да, то копируем первые i байт вашего byte (массив байтов) в безопасное место, то есть поток памяти или файловый поток и продолжить чтение сокета доходите до конца сетевого потока (где i = 0). 1024, 2048 и 4096 кажется хорошим в зависимости от скорости вашей сети, доступной памяти и потоков, которые используют такой буфер. Например, используя 100 потоков с размером 1024 буфера, вы стоите 100 КБ ОЗУ, что ничто в сегодняшней аппаратной шкале.

Лично в большинстве случаев используется интеллектуальный буфер, я имею в виду во время выполнения. Проверяю величину чтения на размер буфера и исправляю его, чтобы получить лучший результат (хотя, если он стоит в соответствии с проектом).

+0

Как именно вы реализуете интеллектуальный буфер? Вы просто предполагаете, что предыдущее прочитало и установили его в размер буфера, чтобы предположить, что следующая величина чтения будет схожей? – CathalMF

+1

@CathalMF: Я начинаю с чего-то вроде 2048, и, например, 'i' равен ему, тогда сделайте его' 4096' и снова проверите его против 'i', пока' i' не станет немного меньше моего буфера. Также, если разница становится большой, я делаю буфер меньше, если память имеет значение. Если есть много потоков, я использую циклические буферы для предотвращения фрагментации памяти (редкое условие для сильно нагруженных машин). – Xaqron

 Смежные вопросы

  • Нет связанных вопросов^_^