Vers allocate()
ou versallocateDirect()
, telle est la question.
Depuis quelques années maintenant, je suis resté fidèle à l'idée que puisque les DirectByteBuffer
s sont un mappage mémoire direct au niveau du système d'exploitation, cela fonctionnerait plus rapidement avec les appels get / put que HeapByteBuffer
s. Je n'ai jamais vraiment été intéressé à connaître les détails exacts de la situation jusqu'à présent. Je veux savoir lequel des deux types de ByteBuffer
s est plus rapide et à quelles conditions.
java
performance
nio
bytebuffer
ROMANIA_engineer
la source
la source
SocketChannel
s qui sont configurés pour ne pas bloquer. Donc, en ce qui concerne ce que @bmargulies a dit,DirectByteBuffer
les performances seront plus rapides pour les chaînes.Réponses:
Ron Hitches dans son excellent livre Java NIO semble offrir ce que je pensais être une bonne réponse à votre question:
la source
Il n'y a aucune raison de s'attendre à ce que les tampons directs soient plus rapides pour l'accès à l' intérieur du jvm. Leur avantage vient lorsque vous les transmettez au code natif - comme le code derrière les canaux de toutes sortes.
la source
Ils ne le sont pas. Ce ne sont que de la mémoire de processus d'application normale, mais non sujettes à une relocalisation pendant Java GC, ce qui simplifie considérablement les choses à l'intérieur de la couche JNI. Ce que vous décrivez s'applique à
MappedByteBuffer
.La conclusion ne découle pas de la prémisse; la prémisse est fausse; et la conclusion est également fausse. Ils sont plus rapides une fois que vous entrez dans la couche JNI, et si vous lisez et écrivez à partir de la même,
DirectByteBuffer
ils sont beaucoup plus rapides, car les données n'ont jamais à traverser la limite JNI.la source
Il est préférable de faire vos propres mesures. La réponse rapide semble être que l'envoi depuis un
allocateDirect()
tampon prend 25% à 75% de temps en moins que laallocate()
variante (testée comme la copie d'un fichier vers / dev / null), en fonction de la taille, mais que l'allocation elle-même peut être considérablement plus lente (même en un facteur de 100x).Sources:
Pourquoi le différentiel de courbe de performance étrange entre ByteBuffer.allocate () et ByteBuffer.allocateDirect ()
ByteBuffer.allocateDirect ridiculement lent
Quand utiliser Array, Buffer ou Direct Buffer
la source