Как ускорить передачу данных через сокет? - PullRequest
0 голосов
/ 07 ноября 2018

В настоящее время я использую этот код как на стороне сервера, так и на стороне клиента. Клиент является устройством Android.

BufferedOutputStream os = new BufferedOutputStream(socket.getOutputStream(),10000000);
BufferedInputStream sin = new BufferedInputStream(socket.getInputStream(),10000000);
os.write("10000000\n".getBytes());
os.flush();
for (int i =0;i<10000000;i++){
    os.write((sampleRead[i]+" ").getBytes());
    }
os.flush();

Проблема в том, что этот код занимает около 80 секунд для передачи данных с Android-клиента на сервер, в то время как для передачи данных обратно с сервера на клиент требуется всего 8 секунд. Код одинаков с обеих сторон, и буфер также одинаков. Я также пытался с разными размерами буфера, но проблема с этим сегментом

for (int i =0;i<10000000;i++){
     os.write((sampleRead[i]+" ").getBytes());
}

Буферизация занимает большую часть времени, в то время как фактическая передача занимает всего около 6-7 секунд при подключении к точке доступа 150 Мбит / с. В чем может быть проблема и как ее решить?

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Прежде всего, как уже заметил комментатор, использование чудовищно большого буфера может быть контрпродуктивным. Как только размер вашего потокового буфера превышает размер сетевого пакета, буферизация на стороне приложения теряет свою эффективность. (Данные в вашем «большом» буфере должны быть разделены на куски размера пакета стеком TCP / IP, прежде чем они попадут в сеть.) Действительно, если буфер на стороне приложения очень большой, вы можете обнаружить, что ваши данные получают застрял в буфере на долгое время в ожидании его заполнения ... пока сеть фактически не используется.

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

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

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

(Сжатие может помочь ... если вы можете позволить ЦП с обеих сторон ... но некоторые каналы передачи данных уже выполняют прозрачное сжатие.)

0 голосов
/ 07 ноября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...