Para allocate()
ou para allocateDirect()
, eis a questão.
Há alguns anos, apenas fico com o pensamento de que, como DirectByteBuffer
s é um mapeamento direto da memória no nível do sistema operacional, ele seria mais rápido com chamadas de recebimento / colocação do que HeapByteBuffer
s. Eu nunca estava realmente interessado em descobrir os detalhes exatos sobre a situação até agora. Quero saber qual dos dois tipos de ByteBuffer
s é mais rápido e em que condições.
java
performance
nio
bytebuffer
ROMANIA_engineer
fonte
fonte
SocketChannel
s configurados para não-bloqueio. Então, com relação ao que @bmargulies disse,DirectByteBuffer
s terá um desempenho mais rápido nos canais.Respostas:
Ron Hitches, em seu excelente livro Java NIO, parece oferecer o que eu pensei que poderia ser uma boa resposta para sua pergunta:
fonte
Não há razão para esperar que buffers diretos sejam mais rápidos para acessar dentro da jvm. A vantagem deles é quando você os passa para o código nativo - como o código por trás de canais de todos os tipos.
fonte
Eles não são. Eles são apenas memória normal do processo do aplicativo, mas não estão sujeitos a realocação durante o Java GC, o que simplifica consideravelmente as coisas dentro da camada JNI. O que você descreve se aplica
MappedByteBuffer
.A conclusão não segue da premissa; a premissa é falsa; e a conclusão também é falsa. Eles são mais rápidos quando você entra na camada JNI e, se você está lendo e gravando a partir da mesma,
DirectByteBuffer
eles são muito mais rápidos, porque os dados nunca precisam cruzar o limite da JNI.fonte
Melhor fazer suas próprias medições. A resposta rápida parece ser que o envio de um
allocateDirect()
buffer leva 25% a 75% menos tempo que aallocate()
variante (testada ao copiar um arquivo para / dev / null), dependendo do tamanho, mas que a alocação em si pode ser significativamente mais lenta (mesmo por um fator de 100x).Fontes:
Por que o diferencial da curva de desempenho ímpar entre ByteBuffer.allocate () e ByteBuffer.allocateDirect ()
ByteBuffer.allocateDirect ridiculamente lento
Quando usar Array, Buffer ou Buffer direto
fonte