Сокеты :BufferedOutputStream или просто OutputStream?

Чтобы получить максимальную скорость передачи по TCP в Java, что лучше:

Вариант А:

InputStream in = socket.getInputStream();
OutputStream out = socket.getOutputStream();

Вариант Б:

BufferedInputStream in = new BufferedInputStream(socket.getInputStream());
BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream());

Я читал, что производительность снижается при записи более 8 КБ в OutputStream, было рекомендовано записывать его небольшими порциями, а не 8 КБ за раз. 8 КиБ — это размер буфера по умолчанию для BufferedOutputStream.

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

Итак, вариант А или вариант Б? Что работает лучше всего?

Прямо сейчас я предполагаю, что вариант A обеспечивает самую высокую скорость передачи, потребляя при этом гораздо больше ресурсов ЦП, чем вариант B. Вариант B может быть лучше, поскольку он не намного медленнее, но экономит много ресурсов ЦП.

--

Дополнительный вопрос :Стоит ли менять размер окна TCP?Например, установив его на 64 КиБ:

socket.setReceiveBufferSize(65536);
socket.setSendBufferSize(65536);

Я попытался установить его на 128 КиБ на тестовой машине, так как я читал, что это может увеличить скорость, но когда сервер получил пару подключений, ЦП был на 100% вместо ~2%, как когда я оставил его в покое. Я думаю, что 128 КиБ слишком много, если у вас нет хорошего сервера, который может справиться с таким наплывом трафика, но разумно ли устанавливать для него что-то вроде 32 КиБ? Я думаю, что по умолчанию для меня было 8 КиБ.

("сокет" - это "java.net.Socket")

10
задан Thufir 15 December 2013 в 22:27
поделиться