Кому allocate()
или кому allocateDirect()
, вот в чем вопрос.
В течение нескольких лет я просто придерживался мысли, что, поскольку DirectByteBuffer
s являются прямым отображением памяти на уровне ОС, он будет работать быстрее с вызовами get / put, чем HeapByteBuffer
s. До сих пор я никогда не был заинтересован в том, чтобы узнать точные детали ситуации. Я хочу знать, какой из двух типов ByteBuffer
работает быстрее и при каких условиях.
java
performance
nio
bytebuffer
РУМЫНИЯ_engineer
источник
источник
SocketChannel
адреса, настроенные для неблокирования. Итак, что касается того, что сказал @bmargulies,DirectByteBuffer
s будет работать быстрее для каналов.Ответы:
Рон Хитчес в своей превосходной книге Java NIO, кажется, предлагает то, что, по моему мнению, могло бы стать хорошим ответом на ваш вопрос:
источник
Там нет никаких оснований ожидать , прямые буфера быстрее для доступа внутри виртуальной машины. Их преимущество проявляется в том, что вы передаете их в машинный код, например, в код всех типов каналов.
источник
Это не так. Это просто обычная память процесса приложения, но она не подлежит перемещению во время Java GC, что значительно упрощает работу на уровне JNI. То, что вы описываете, применимо к
MappedByteBuffer
.Вывод не следует из посылки; посылка ложная; и вывод тоже ложный. Они работают быстрее, как только вы попадаете внутрь уровня JNI, и если вы читаете и записываете с того же уровня,
DirectByteBuffer
они намного быстрее, потому что данные никогда не должны пересекать границу JNI.источник
Лучше всего делать свои собственные измерения. Быстрый ответ, похоже, заключается в том, что отправка из
allocateDirect()
буфера занимает на 25-75% меньше времени, чемallocate()
вариант (тестировался как копирование файла в / dev / null), в зависимости от размера, но само выделение может быть значительно медленнее (даже на в 100 раз).Источники:
Почему разница в кривой производительности между ByteBuffer.allocate () и ByteBuffer.allocateDirect ()
ByteBuffer.allocateDirect смехотворно медленный
Когда использовать массив, буфер или прямой буфер
источник