Почему разница в кривой производительности между ByteBuffer.allocate () и ByteBuffer.allocateDirect ()

Я работаю на некотором коде SocketChannel -to- SocketChannel , который лучше всего работает с прямым байтовым буфером - долгоживущим и большим (от десятков до сотен мегабайт на соединение). структура цикла с FileChannel s, я провел несколько микро-тестов производительности ByteBuffer.allocate () по сравнению с ByteBuffer.allocateDirect () .

сюрприз в результатах, который я не могу объяснить. На приведенном ниже графике есть очень явный провал в 256 КБ и 512 КБ для ByteBuffer. allocate () реализация передачи - производительность упала на ~ 50%! Также кажется, что для ByteBuffer.allocateDirect () падение производительности должно быть меньше. (Серия% -gain помогает визуализировать эти изменения.)

Размер буфера (байты) в зависимости от времени (MS)

The Pony Gap

Почему разница кривой производительности между ByteBuffer.allocate () и ] ByteBuffer.allocateDirect () ? Что именно происходит за кулисами?

Это очень хорошо, возможно, зависит от оборудования и ОС, поэтому вот эти подробности:

  • MacBook Pro с двухъядерным процессором Core 2 CPU
  • SSD-накопитель Intel X25M
  • OSX 10.6.4

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

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

Когда мне следует использовать монады и когда мне следует использовать стрелки?

69
задан nbro 7 April 2017 в 10:20
поделиться