Чтобы получить максимальную скорость передачи по 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")