Para allocate()
o para allocateDirect()
, esa es la pregunta.
Desde hace algunos años, me he quedado pegado a la idea de que, dado que DirectByteBuffer
s es un mapeo directo de memoria a nivel del sistema operativo, funcionaría más rápido con las llamadas get / put que HeapByteBuffer
s. Nunca estuve realmente interesado en averiguar los detalles exactos sobre la situación hasta ahora. Quiero saber cuál de los dos tipos de ByteBuffer
s es más rápido y en qué condiciones.
java
performance
nio
bytebuffer
RUMANIA_ingeniero
fuente
fuente
SocketChannel
electrónicos que están configurados para no bloquearse. Entonces, con respecto a lo que dijo @bmargulies,DirectByteBuffer
s funcionará más rápido para los canales.Respuestas:
Ron Hitches en su excelente libro Java NIO parece ofrecer lo que pensé que podría ser una buena respuesta a su pregunta:
fuente
No hay razón para esperar que los buffers directos sean más rápidos para acceder dentro de jvm. Su ventaja viene cuando los pasa al código nativo, como el código detrás de canales de todo tipo.
fuente
No lo son Son solo memoria de proceso de aplicación normal, pero no están sujetas a reubicación durante Java GC, lo que simplifica considerablemente las cosas dentro de la capa JNI. Lo que usted describe se aplica a
MappedByteBuffer
.La conclusión no se sigue de la premisa; la premisa es falsa; y la conclusión también es falsa. Son más rápidos una vez que ingresas a la capa JNI, y si estás leyendo y escribiendo desde el mismo
DirectByteBuffer
, son mucho más rápidos, porque los datos nunca tienen que cruzar el límite JNI.fuente
Lo mejor es hacer tus propias medidas. La respuesta rápida parece ser que el envío desde un
allocateDirect()
búfer lleva entre un 25% y un 75% menos de tiempo que laallocate()
variante (probado como copiar un archivo a / dev / null), dependiendo del tamaño, pero que la asignación en sí puede ser significativamente más lenta (incluso si un factor de 100x).Fuentes:
Por qué el diferencial de curva de rendimiento impar entre ByteBuffer.allocate () y ByteBuffer.allocateDirect ()
ByteBuffer.allocateDirect ridículamente lento
Cuándo usar Array, Buffer o Buffer directo
fuente