Подтвердить что ты не робот

Преимущества Java NIO в режиме блокировки по сравнению с традиционными ввода-выводами?

Я уже давно решил не использовать асинхронную, неблокирующую Java NIO. В целом сложность и польза очень сомнительна, и я думаю, что это не стоит в этом проекте в частности.

Но большинство из того, что я читал о NIO, и сравнения со старым java.io. * фокусируются на неблокирующих, асинхронных NIO и синхронных вводах-выводах на одном потоке с использованием java.io. *. Однако NIO можно использовать в синхронном, блокирующем режиме с потоком за соединение, о чем редко говорят.

Здесь вопрос: есть ли преимущество в производительности синхронного, блокирующего NIO по сравнению с традиционным синхронным, блокирующим вводом-выводом (java.io. *)? Оба будут потоками для каждого соединения. Как сложность сравнивается?

Обратите внимание, что это общий вопрос, но на данный момент я в первую очередь обеспокоен связью сокетов TCP.

4b9b3361

Ответ 1

Преимущество NIO над "традиционным" IO заключается в том, что NIO может использовать прямые буферы, которые позволяют ОС использовать DMA для некоторых операций (например, чтение из сетевого подключения непосредственно в файл с отображением памяти) и тем самым избежать копирования данных в промежуточные буферы.

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

Ответ 2

В основном это сводит к минимуму количество одновременных подключений и насколько заняты эти соединения. Блокировка (стандартный поток на соединение) выполняется быстрее, как в латентности, так и в пропускной способности (примерно в два раза быстрее для простого сервера эха). Поэтому, если ваша система может справиться с поддержанием потока для каждого соединения (< 1000 соединений как правило), перейдите для подхода блокировки. Если у вас есть много простаивающих подключений (например, запросы на длительный опрос Comet или незанятые соединения IMAP), то переход на неблокирующую архитектуру может помочь масштабировать вашу систему.

Ответ 3

Я не могу говорить с технологией в частности, но для асинхронных библиотек не является необычным предоставлять синхронные операции для облегчения отладки.

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