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 ]
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.
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个并发客户端
使用字符串,QPS可以达到4019.70,传输率为40491.45KB每秒。
2.使用Buffer。将字符串转换为Buffer对象,再发给客户端。
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);
取消Buffer转换的注释,同样使用ab -c 200 -t 100
http://127.0.0.1:8001/测试,同样发起200个并发客户端
使用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
ab -c 200 -t 100
http://127.0.0.1:8001/ zum Testen und starten Sie außerdem 200 gleichzeitige Clients
Das obige Vergleichsbeispiel stammt aus „Ausführliche Erläuterung von Node JS“.Der Grund ist eigentlich sehr einfach: Wenn in NodeJS bei der HTTP-Übertragung der zurückgegebene TypDann stellt sich die Frage: Warum gibt es eine so große Leistungsverbesserung?
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#L612Im Leistungsvergleichsbeispiel oben, wenn string
zurü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.
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!