Я работаю на некотором коде SocketChannel
-to- SocketChannel
, который лучше всего работает с прямым байтовым буфером - долгоживущим и большим (от десятков до сотен мегабайт на соединение). структура цикла с FileChannel
s, я провел несколько микро-тестов производительности ByteBuffer.allocate ()
по сравнению с ByteBuffer.allocateDirect ()
.
сюрприз в результатах, который я не могу объяснить. На приведенном ниже графике есть очень явный провал в 256 КБ и 512 КБ для ByteBuffer. allocate ()
реализация передачи - производительность упала на ~ 50%! Также кажется, что для ByteBuffer.allocateDirect ()
падение производительности должно быть меньше. (Серия% -gain помогает визуализировать эти изменения.)
Размер буфера (байты) в зависимости от времени (MS)
Почему разница кривой производительности между ByteBuffer.allocate ()
и ] ByteBuffer.allocateDirect ()
? Что именно происходит за кулисами?
Это очень хорошо, возможно, зависит от оборудования и ОС, поэтому вот эти подробности:
Исходный код, по запросу: Я также понимаю, что их можно использовать для решения подобных проблем.
Однако я все еще немного не понимаю, как выбрать, какой из них использовать в той или иной ситуации.
Когда мне следует использовать монады и когда мне следует использовать стрелки?