Zu allocate()
oder zu allocateDirect()
, das ist die Frage.
Seit einigen Jahren bin ich nur bei dem Gedanken geblieben, dass DirectByteBuffer
s , da es sich um eine direkte Speicherzuordnung auf Betriebssystemebene handelt, bei get / put-Aufrufen schneller funktioniert als HeapByteBuffer
s. Ich war bis jetzt nie wirklich daran interessiert, die genauen Details der Situation herauszufinden. Ich möchte wissen, welche der beiden Arten von ByteBuffer
s unter welchen Bedingungen schneller sind.
java
performance
nio
bytebuffer
ROMANIA_engineer
quelle
quelle
SocketChannel
s verwendet, die für die Nichtblockierung konfiguriert sind. In Bezug auf das, was @bmargulies gesagt hat, wirdDirectByteBuffer
s für die Kanäle schneller abschneiden .Antworten:
Ron Hitches scheint in seinem ausgezeichneten Buch Java NIO das zu bieten, was ich für eine gute Antwort auf Ihre Frage hielt:
quelle
Es gibt keinen Grund zu der Annahme , dass direkte Puffer für den Zugriff innerhalb des JVM schneller sind. Ihr Vorteil ergibt sich, wenn Sie sie an nativen Code übergeben - beispielsweise an den Code hinter Kanälen aller Art.
quelle
Sie sind nicht. Sie sind nur normaler Anwendungsprozessspeicher, können jedoch während Java GC nicht verschoben werden, was die Dinge innerhalb der JNI-Schicht erheblich vereinfacht. Was Sie beschreiben, gilt für
MappedByteBuffer
.Die Schlussfolgerung folgt nicht aus der Prämisse; die Prämisse ist falsch; und die Schlussfolgerung ist auch falsch. Sie sind schneller, sobald Sie sich in der JNI-Ebene befinden, und wenn Sie von derselben lesen und schreiben
DirectByteBuffer
, sind sie viel schneller, da die Daten die JNI-Grenze überhaupt nicht überschreiten müssen.quelle
Am besten machen Sie Ihre eigenen Messungen. Die schnelle Antwort scheint zu sein, dass das Senden aus einem
allocateDirect()
Pufferallocate()
je nach Größe 25% bis 75% weniger Zeit in Anspruch nimmt als die Variante (getestet als Kopieren einer Datei nach / dev / null), die Zuordnung selbst jedoch erheblich langsamer sein kann (selbst durch ein Faktor von 100x).Quellen:
Warum die ungerade Leistungskurve zwischen ByteBuffer.allocate () und ByteBuffer.allocateDirect ()
ByteBuffer.allocateDirect lächerlich langsam
Wann wird Array, Buffer oder Direct Buffer verwendet?
quelle