Eine einfache Regel, wann ich direkte Puffer mit Java NIO für Netzwerk-I / O verwenden sollte?

8

Kann jemand mit der natürlichen Gabe, komplexe Dinge auf einfache und unkomplizierte Weise zu erklären, diese Frage beantworten? Um die beste Leistung zu erzielen, wann sollte ich direkte ByteBuffers im Gegensatz zu normalen ByteBuffers verwenden, wenn ich Netzwerk-I / O mit Java NIO betreibe?

Zum Beispiel: Sollte ich in einen Haufen Puffer lesen und es von dort analysieren, viele tun () (Byte für Byte) oder sollte ich es in einen direkten Puffer lesen und aus dem direkten Puffer analysieren?

    
JohnPristine 29.08.2012, 23:40
quelle

2 Antworten

11
___ qstntxt ___

Kann jemand mit der natürlichen Gabe, komplexe Dinge auf einfache und unkomplizierte Weise zu erklären, diese Frage beantworten? Um die beste Leistung zu erzielen, wann sollte ich direkte ByteBuffers im Gegensatz zu normalen ByteBuffers verwenden, wenn ich Netzwerk-I / O mit Java NIO betreibe?

Zum Beispiel: Sollte ich in einen Haufen Puffer lesen und es von dort analysieren, viele tun () (Byte für Byte) oder sollte ich es in einen direkten Puffer lesen und aus dem direkten Puffer analysieren?

    
___ qstnhdr ___ Eine einfache Regel, wann ich direkte Puffer mit Java NIO für Netzwerk-I / O verwenden sollte? ___ answer12188143 ___

Ein direkter Puffer ist am besten, wenn Sie nur die Daten kopieren, etwa von einem Socket in eine Datei oder umgekehrt , da die Daten die JNI / Java-Grenze nicht durchlaufen müssen bleibt nur in JNI Land. Wenn Sie planen, die Daten selbst zu betrachten, gibt es in einem direkten Puffer keinen Sinn.

    
___ tag123cssselectors ___ Selektoren sind Muster, die mit Elementen in einer Dokumentstruktur übereinstimmen. In einer CSS-Regel werden sie verwendet, um Stile für Elemente zu definieren, die dem Muster entsprechen. ___ tag123nio ___ NIO ist Java 'New I / O' eingeführt in 1.4, bietet nicht-blockierende und gemultiplexte Netzwerk-I / O; 'direkte' (native) Puffer; Dateisperren und zugeordnete Dateien; und Zeichensatzcodecs. ___ tag123bytepuffer ___ Ein binärer Puffer ohne spezifische Codierung. Verwenden Sie dieses Tag nur, wenn Sie bestimmte Probleme in Bezug auf Bytepuffer haben ___ tag123realtime ___ Eine Aufgabe ist in Echtzeit, wenn die Fertigstellung der Aktivitäten eine funktionale Anforderung und eine Korrektheitsbedingung ist, und nicht nur eine Leistungsmetrik. Ein Echtzeitsystem ist ein System, in dem einige (wenn auch vielleicht nicht alle) Aufgaben Echtzeitaufgaben sind. BENUTZEN SIE DIESEN TAG NICHT, wenn Sie nur "real-world" meinen. ___ tag123java ___ Java (nicht zu verwechseln mit JavaScript oder JScript oder JS) ist eine universelle objektorientierte Programmiersprache, die für die Verwendung in Verbindung mit der Java Virtual Machine (JVM) entwickelt wurde. "Java-Plattform" ist der Name für ein Computersystem, auf dem Tools zum Entwickeln und Ausführen von Java-Programmen installiert sind. Verwenden Sie dieses Tag für Fragen, die sich auf die Java-Programmiersprache oder Java-Plattform-Tools beziehen. ___ antwort12192090 ___
  

Um die beste Leistung zu erzielen, wann sollte ich direkte ByteBuffers im Gegensatz zu normalen ByteBuffers verwenden, wenn ich Netzwerk-I / O mit Java NIO betreibe?

Direkte Puffer haben eine Reihe von Vorteilen

  • Vermeiden Sie eine zusätzliche Kopie von Daten zwischen Java und nativem Speicher.
  • Wenn sie wiederverwendet werden, wird nur die verwendete Seite in echten Speicher umgewandelt. Das heißt, Sie können sie viel größer als sie benötigen, und sie verschwenden nur virtuelles Gedächtnis.
  • Sie können auf Multi-Byte-Primitive in nativer Byte-Reihenfolge effizient zugreifen. (Grundsätzlich eine Maschinencode-Anweisung)
  

Sollte ich in einen Heap-Puffer lesen und von dort analysieren, viele get () (Byte für Byte) ODER sollte ich es in einen direkten Puffer lesen und aus dem direkten Puffer analysieren?

Wenn Sie ein Byte zu einem Zeitpunkt lesen, erhalten Sie möglicherweise nicht viel Vorteil. Mit einem direkten Byte-Puffer können Sie jedoch 2 oder 4 Bytes gleichzeitig lesen und mehrere Bytes gleichzeitig parsen.

  

[Echtzeit] [Selektoren]

Wenn Sie Echtzeitdaten analysieren, würde ich die Verwendung von Selektoren vermeiden. Ich habe festgestellt, mit NIO oder beschäftigt NIO NIO können Sie die niedrigste Latenz Leistung geben (vorausgesetzt, Sie haben eine relativ kleine Anzahl von Verbindungen, z. B. bis zu 20)

    
___
Peter Lawrey 30.08.2012, 07:39
quelle
4

Ein direkter Puffer ist am besten, wenn Sie nur die Daten kopieren, etwa von einem Socket in eine Datei oder umgekehrt , da die Daten die JNI / Java-Grenze nicht durchlaufen müssen bleibt nur in JNI Land. Wenn Sie planen, die Daten selbst zu betrachten, gibt es in einem direkten Puffer keinen Sinn.

    
EJP 30.08.2012 00:00
quelle