Ke allocate()
atau ke allocateDirect()
, itulah pertanyaannya.
Selama beberapa tahun sekarang saya hanya terjebak pada pemikiran bahwa karena DirectByteBuffer
s adalah pemetaan memori langsung pada tingkat OS, itu akan melakukan lebih cepat dengan panggilan get / put daripada HeapByteBuffer
s. Saya tidak pernah benar-benar tertarik untuk mencari tahu detail yang tepat mengenai situasi sampai sekarang. Saya ingin tahu yang mana dari dua jenis ByteBuffer
s yang lebih cepat dan pada kondisi apa.
java
performance
nio
bytebuffer
ROMANIA_engineer
sumber
sumber
SocketChannel
s yang dikonfigurasi untuk non-blocking. Jadi mengenai apa yang dikatakan @bmargulies,DirectByteBuffer
s akan bekerja lebih cepat untuk saluran.Jawaban:
Ron Hitches dalam bukunya yang luar biasa Java NIO tampaknya menawarkan apa yang saya pikir bisa menjadi jawaban yang baik untuk pertanyaan Anda:
sumber
Tidak ada alasan untuk mengharapkan buffer langsung lebih cepat untuk akses di dalam jvm. Keuntungan mereka datang ketika Anda meneruskannya ke kode asli - seperti, kode di balik semua saluran.
sumber
Mereka bukan. Mereka hanya memori proses aplikasi normal, tetapi tidak mengalami relokasi selama Java GC yang menyederhanakan banyak hal di dalam lapisan JNI. Apa yang Anda uraikan berlaku untuk
MappedByteBuffer
.Kesimpulannya tidak mengikuti dari premis; premisnya salah; dan kesimpulannya juga salah. Mereka lebih cepat begitu Anda masuk ke dalam lapisan JNI, dan jika Anda membaca dan menulis dari yang sama
DirectByteBuffer
mereka jauh lebih cepat, karena data tidak pernah harus melewati batas JNI sama sekali.sumber
Terbaik untuk melakukan pengukuran Anda sendiri. Jawaban cepat tampaknya bahwa pengiriman dari
allocateDirect()
buffer membutuhkan waktu 25% hingga 75% lebih sedikit dariallocate()
varian (diuji sebagai menyalin file ke / dev / null), tergantung pada ukuran, tetapi alokasi itu sendiri dapat secara signifikan lebih lambat (bahkan oleh faktor 100x).Sumber:
Mengapa perbedaan kurva kinerja aneh antara ByteBuffer.allocate () dan ByteBuffer.allocateDirect ()
ByteBuffer.allocateDirect sangat lambat
Kapan menggunakan Array, Buffer atau Buffer langsung
sumber