Heim >Web-Frontend >js-Tutorial >Detaillierte Erläuterung der Verwendung von Node.js Buffer

Detaillierte Erläuterung der Verwendung von Node.js Buffer

青灯夜游
青灯夜游nach vorne
2020-08-29 10:23:542235Durchsuche

Detaillierte Erläuterung der Verwendung von Node.js Buffer

JavaScript wurde ursprünglich für Browser entwickelt und verfügt über keinen Mechanismus zum Lesen oder Bearbeiten binärer Datenströme. Die Einführung der Buffer-Klasse gibt NodeJS die Möglichkeit, Dateistreams zu betreiben oder Binärstreams zu vernetzen. [Empfohlenes Video-Tutorial: node js-Tutorial ]

Grundkonzept von Buffer

Die Speicherzuweisung des Buffer-Objekts erfolgt nicht im Heap-Speicher von V8, sondern Node führt eine Speicheranwendung auf C++-Ebene durch, was so verstanden werden kann wird separat im Speicher geöffnet Teil des Speicherplatzes, aber die Zuweisung des Speichers bei Verwendung wird durch die Knotenebene abgeschlossen, und die Freigabe wird auch automatisch durch den GC-Mechanismus von v8 im Knoten gesteuert. Die Grundfunktionen von Buffer werden hier nicht im Detail beschrieben. Die offizielle Dokumentation ist sehr detailliert.

Vergleich der Pufferleistung

Normalerweise müssen Daten während der Netzwerkübertragung in Puffer umgewandelt werden. Lassen Sie uns ein Leistungsvergleichsexperiment durchführen.

1. Verwenden Sie reine Zeichenfolgen, um zum Client zurückzukehren

const http = require('http');

let hello = ''
for (var i = 0; i < 10240; i++) {
  hello += "a";
}

console.log(`Hello:${hello.length}`)
// hello = Buffer.from(hello);

http.createServer((req, res) => {
  res.writeHead(200);
  res.end(hello);
}).listen(8001);

Verwenden Sie den Befehl ab -c 200 -t 100 http://127.0.0.1:8001/ für Leistungstests. Initiieren Sie 200 gleichzeitige Clients. ab -c 200 -t 100 http://127.0.0.1:8001/命令来进行性能测试,发起200个并发客户端

Detaillierte Erläuterung der Verwendung von Node.js Buffer

使用字符串,QPS可以达到4019.70,传输率为40491.45KB每秒。

2.使用Buffer。将字符串转换为Buffer对象,再发给客户端。

const http = require(&#39;http&#39;);

let hello = &#39;&#39;
for (var i = 0; i < 10240; i++) {
  hello += "a";
}

console.log(`Hello:${hello.length}`)
hello = Buffer.from(hello);

http.createServer((req, res) => {
  res.writeHead(200);
  res.end(hello);
}).listen(8001);

取消Buffer转换的注释,同样使用ab -c 200 -t 100 http://127.0.0.1:8001/测试,同样发起200个并发客户端

Detaillierte Erläuterung der Verwendung von Node.js Buffer

使用Buffer,QPS达到7130.05,传输率为71822.74KB每秒。
性能是原来的177%,极大的节省了服务器资源。
上面这个对比示例参考于《深入浅出Node JS》。

那么问题来了,为什么会有这么大的性能提升呢?

道理其实很简单,在NodeJS中,进行http传输时,若返回的类型为string,则会将string类型的参数,转换为Buffer,通过NodeJS中的Stream流,一点点的返回给客户端。如果我们直接返回Buffer类型,就没有了转换操作,直接返回,减少了CPU的重复使用率。这一部分逻辑见Node源码https://github.com/nodejs/node/blob/v10.9.0/lib/_http_outgoing.js#L612

在上面性能对比示例中,返回string时,每次请求都需要将string

>

Mit Strings kann QPS 4019,70 erreichen und die Übertragungsrate beträgt 40491,45 KB pro Sekunde.

  • 2. Puffer verwenden. Wandeln Sie die Zeichenfolge in ein Buffer-Objekt um und senden Sie es an den Client.
  • rrreee
  • Kommentieren Sie die Pufferkonvertierung aus, verwenden Sie auch ab -c 200 -t 100 http://127.0.0.1:8001/ zum Testen und starten Sie außerdem 200 gleichzeitige Clients

    Detaillierte Erläuterung der Verwendung von Node.js Buffer

  • Mit Buffer erreicht QPS 7130,05 und die Übertragungsrate beträgt 71822,74 KB pro Sekunde.
Die Leistung beträgt 177 % des Originals, wodurch Serverressourcen erheblich gespart werden.
Das obige Vergleichsbeispiel stammt aus „Ausführliche Erläuterung von Node JS“.

Dann stellt sich die Frage: Warum gibt es eine so große Leistungsverbesserung?

Der Grund ist eigentlich sehr einfach: Wenn in NodeJS bei der HTTP-Übertragung der zurückgegebene Typ string ist, wird der Parameter vom Typ string in Buffer konvertiert übergeben Der Stream-Stream in NodeJS wird Stück für Stück an den Client zurückgegeben. Wenn wir den Puffertyp direkt zurückgeben, gibt es keinen Konvertierungsvorgang und keine direkte Rückgabe, was die Wiederverwendungsrate der CPU verringert. Dieser Teil der Logik ist im Node-Quellcode https ://github.com/nodejs/node/blob/v10.9.0/lib/_http_outgoing.js#L612

Im Leistungsvergleichsbeispiel oben, wenn stringzurückgegeben wird >, jede Anfrage erfordert Ersetzen Sie string durch Buffer und geben Sie Buffer direkt zurück. Dieser Buffer wird im Speicher gespeichert, wenn wir den Dienst starten. Jede Anfrage kann den Buffer direkt im Speicher zurückgeben, sodass Buffer verwendet wird Das QPS vorne und hinten hat sich stark verbessert.

Daher können beim Schreiben von Geschäftscode einige Ressourcen im Voraus in Puffertypen konvertiert werden (z. B. JS, CSS und andere statische Ressourcendateien) und der Puffer kann beispielsweise in einer Datei direkt an den Client zurückgegeben werden Weiterleitungsszenarien speichern den erhaltenen Inhalt als Puffer und leiten ihn direkt weiter, um zusätzliche Konvertierungsvorgänge zu vermeiden. 🎜🎜Referenzen: 🎜🎜🎜🎜http://nodejs.cn/api/buffer.html🎜🎜🎜🎜🎜https://book.douban.com/subje...🎜🎜🎜🎜🎜🎜Dieser Artikel ist reproduziert von: https://segmentfault.com/a/1190000016056466🎜🎜🎜Weitere Kenntnisse zum Thema Programmierung finden Sie unter: 🎜Programmierlehre🎜! ! 🎜🎜

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Verwendung von Node.js Buffer. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen