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个并发客户端
使用字符串,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
- 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 Mit Buffer erreicht QPS 7130,05 und die Übertragungsrate beträgt 71822,74 KB pro Sekunde.
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!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen



Der nicht blockierende und ereignisgesteuerte Knotendienst hat den Vorteil eines geringen Speicherverbrauchs und eignet sich sehr gut für die Verarbeitung massiver Netzwerkanforderungen. Unter der Voraussetzung massiver Anfragen müssen Probleme im Zusammenhang mit der „Speicherkontrolle“ berücksichtigt werden. 1. Der Garbage-Collection-Mechanismus und die Speicherbeschränkungen von V8 Js wird von der Garbage-Collection-Maschine gesteuert

Dieser Artikel vermittelt Ihnen ein detailliertes Verständnis des Speichers und Garbage Collectors (GC) der NodeJS V8-Engine. Ich hoffe, er wird Ihnen hilfreich sein!

Das Dateimodul ist eine Kapselung der zugrunde liegenden Dateioperationen, wie z. B. Lesen/Schreiben/Öffnen/Schließen/Löschen von Dateien, Hinzufügen usw. Das größte Merkmal des Dateimoduls besteht darin, dass alle Methoden zwei Versionen von **synchronem** und **bereitstellen. asynchron**, mit Methoden mit dem Suffix sync sind alle Synchronisationsmethoden, und diejenigen ohne sind alle heterogene Methoden.

Die Auswahl eines Docker-Images für Node mag trivial erscheinen, aber die Größe und potenziellen Schwachstellen des Images können erhebliche Auswirkungen auf Ihren CI/CD-Prozess und Ihre Sicherheit haben. Wie wählen wir also das beste Node.js-Docker-Image aus?

Node 19 wurde offiziell veröffentlicht. Dieser Artikel wird Ihnen eine detaillierte Erklärung der 6 Hauptfunktionen von Node.js 19 geben. Ich hoffe, er wird Ihnen hilfreich sein!

Wie führt Node.js GC (Garbage Collection) durch? Der folgende Artikel führt Sie durch.

Die Ereignisschleife ist ein grundlegender Bestandteil von Node.js und ermöglicht die asynchrone Programmierung, indem sie sicherstellt, dass der Hauptthread nicht blockiert wird. Das Verständnis der Ereignisschleife ist für die Erstellung effizienter Anwendungen von entscheidender Bedeutung. Der folgende Artikel wird Ihnen ein detailliertes Verständnis der Ereignisschleife in Node vermitteln. Ich hoffe, er wird Ihnen hilfreich sein!

Der Grund, warum der Knoten den Befehl npm nicht verwenden kann, liegt darin, dass die Umgebungsvariablen nicht richtig konfiguriert sind. Die Lösung ist: 1. Öffnen Sie „Systemeigenschaften“ 2. Suchen Sie nach „Umgebungsvariablen“ -> „Systemvariablen“ und bearbeiten Sie dann die Umgebung Variablen; 3. Suchen Sie den Speicherort des NodeJS-Ordners. 4. Klicken Sie auf „OK“.
