Heim >Web-Frontend >js-Tutorial >Was ist Puffer? Ausführliche Erläuterung der Verwendung von Buffer und spezifische Beispiele für Anwendungsszenarien
JavaScript ist sehr benutzerfreundlich für die String-Verarbeitung. Unabhängig davon, ob es sich um einen Wide-Byte- oder einen Single-Byte-String handelt, wird er als String betrachtet. Der Knoten muss Netzwerkprotokolle verarbeiten, Datenbanken betreiben, Bilder verarbeiten, Dateien hochladen usw. Er muss auch eine große Menge an Binärdaten verarbeiten. Die integrierten Zeichenfolgen erfüllen diese Anforderungen bei weitem nicht, daher wurde Buffer ins Leben gerufen.
Pufferstruktur
Puffer ist ein typisches Modul, das Javascript und C++ kombiniert. Die leistungsbezogenen Teile sind in C++ implementiert und die nicht leistungsbezogenen Teile. Verwandte Teile sind in Javascript implementiert.
Der Knoten hat den Puffer bereits in den Speicher geladen, als der Prozess startet, und legt ihn in das globale Objekt ein, sodass keine Notwendigkeit besteht, ihn zu benötigen.
Pufferobjekt: Ähnlich einem Array, dessen Elemente sind hexadezimale Doppelziffern.
Pufferspeicherzuweisung
Die Speicherzuweisung des Pufferobjekts befindet sich nicht im Heapspeicher von V8, und die Speicheranwendung wird auf der C++-Ebene von Node implementiert.
Um den angeforderten Speicher effizient zu nutzen, übernimmt Node den Slab-Zuweisungsmechanismus. Slab ist ein dynamischer Speicherverwaltungsmechanismus, der verschiedene *nix-Betriebssysteme anwendet. Die Platte hat drei Zustände:
(1) voll: vollständig zugewiesener Zustand
(2) teilweise: teilweise zugewiesener Zustand
(3) leer: nicht zugewiesener Zustand
Pufferkonvertierung
Pufferobjekte können in Zeichenfolgen konvertiert werden. Die unterstützten Kodierungstypen sind wie folgt:
ASCII, UTF-8, UTF-16LE/UCS -2, Base64, Binär, Hex
String to Buffer
new Buffer(str, [encoding]), default UTF-8
buf write( string, [offset], [length], [encoding])
Buffer to string
buf.toString([encoding], [start], [end] )
Codierungstyp wird von Buffer nicht unterstützt
Bestimmen Sie, ob er durch Buffer.isEncoding(encoding) unterstützt wird
iconv-lite: reine JavaScript-Implementierung, leichter, bessere Leistung , C++ muss nicht in Javascript konvertiert werden
iconv: Rufen Sie die libiconv-Bibliothek von C++ auf, um den Vorgang abzuschließen
Pufferspleißen
Hinweis „res.on( 'data ', function(chunk) {})", der Parameter chunk ist ein Buffer-Objekt. Durch die direkte Verwendung von + Splicing wird er automatisch in eine Zeichenfolge konvertiert. Bei Wide-Byte-Zeichen können verstümmelte Zeichen generiert werden,
Lösung:
(1) Durch die setEncoding()-Methode im lesbaren Stream ermöglicht diese Methode die Übermittlung des Datenereignisses nicht mehr als Pufferobjekt, sondern als codierte Zeichenfolge Das StringEncoder-Modul wird intern verwendet.
(2) Speichern Sie das Buffer-Objekt vorübergehend in einem Array, fügen Sie es schließlich zu einem großen Buffer zusammen und codieren Sie es dann zur Ausgabe in einen String.
Puffer wird häufig bei Datei-E/A und Netzwerk-E/A verwendet. Seine Leistung ist sehr wichtig und seine Leistung ist viel höher als die von gewöhnlichen Zeichenfolgen.
Zusätzlich zum Leistungsverlust beim Konvertieren von Zeichenfolgen weist die Verwendung von Buffer eine HighWaterMark-Einstellung auf, die für die Leistung beim Lesen von Dateien entscheidend ist.
a. Die highWaterMark-Einstellung hat einen gewissen Einfluss auf die Zuweisung und Nutzung des Pufferspeichers.
b. Wenn highWaterMark zu klein eingestellt ist, kann es zu zu vielen Systemaufrufen kommen.
Wann Puffer verwendet werden soll und wann nicht ------ Reines Javascript unterstützt Unicode-Code, aber keinen Binärcode. Beim Umgang mit TCP-Streams oder Datei-Streams ist eine Verarbeitung des Streams erforderlich Wenn wir Nicht-UTF-8-Zeichenfolgen, Binärformate und andere Formate speichern, müssen wir „Puffer“ verwenden.
Beispieleinführung
var buf = new Buffer("this is text concat test !") ,str = "this is text concat test !" ; console.time("buffer concat test !"); var list = [] ; var len = 100000 * buf.length ; for(var i=0;i<100000;i++){ list.push(buf) ; len += buf.length ; } var s1 = Buffer.concat(list, len).toString() ; console.timeEnd("buffer concat test !") ; console.time("string concat test !") ; var list = [] ; for (var i = 100000; i >= 0; i--) { list.push(str) ; } var s2 = list.join("") ; console.timeEnd("string concat test !") ;
Das Folgende sind die laufenden Ergebnisse:
Die Lesegeschwindigkeit der Zeichenfolge ist definitiv schneller, der Puffer erfordert auch die Operation toString(). Wenn wir also eine Zeichenfolge speichern, sollten wir weiterhin eine Zeichenfolge verwenden. Auch wenn eine große Zeichenfolge zu einer Zeichenfolge gespleißt wird, ist sie nicht langsamer als der Puffer.
Wann müssen wir also wieder Puffer verwenden? Wenn es keine andere Möglichkeit gibt und wir Nicht-UTF-8-Zeichenfolgen, Binärformate und andere Formate speichern, müssen wir diese verwenden.
Das obige ist der detaillierte Inhalt vonWas ist Puffer? Ausführliche Erläuterung der Verwendung von Buffer und spezifische Beispiele für Anwendungsszenarien. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!