Le contenu de cet article porte sur qu'est-ce que le tampon dans Nodejs ? L'utilisation de la classe tampon dans Nodejs a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. J'espère que cela vous sera utile.
JavaScript a été conçu à l'origine pour les navigateurs et ne dispose d'aucun mécanisme pour lire ou manipuler les flux de données binaires. L'introduction de la classe Buffer donne à NodeJS la possibilité d'exploiter des flux de fichiers ou des flux binaires réseau.
Concepts de base de Buffer
L'allocation mémoire de l'objet Buffer n'est pas dans la mémoire tas de la V8, mais Node effectue une application mémoire au niveau C++, ce qui peut être compris comme en mémoire Une partie de l'espace est ouverte séparément, mais l'allocation de mémoire lorsqu'elle est utilisée est complétée par le niveau Node, et la libération est également automatiquement contrôlée par le mécanisme gc de la v8 dans Node. Les opérations de base de Buffer ne seront pas décrites en détail ici. La documentation officielle est très détaillée.
Comparaison des performances du tampon
Habituellement, lors de la transmission réseau, les données doivent être converties en tampon. Faisons une expérience de comparaison des performances.
1. Utilisez une chaîne pure pour revenir au client
const http = require('http'); let hello = '' for (var i = 0; i { res.writeHead(200); res.end(hello); }).listen(8001);
Utilisez le ab -c 200 -t 100
http://127.0.0.1:8001/ commande pour effectuer un test de performances et lancer 200 clients simultanés
À l'aide de chaînes, QPS peut atteindre 4019,70, transmission Le débit est de 40491,45 Ko par seconde.
2. Utilisez le tampon. Convertissez la chaîne en un objet Buffer, puis envoyez-la au client.
const http = require('http'); let hello = '' for (var i = 0; i { res.writeHead(200); res.end(hello); }).listen(8001);
Décommentez la conversion Buffer, utilisez également ab -c 200 -t 100
http://127.0.0.1:8001/ pour tester et lancez également 200 clients simultanés.
En utilisant Buffer, le QPS atteint 7130,05 et le taux de transfert est de 71822,74 Ko par seconde.
Les performances sont de 177 % par rapport à l'original, ce qui permet d'économiser considérablement les ressources du serveur.
L'exemple de comparaison ci-dessus est référencé dans "Introduction approfondie à Node JS".
Alors la question est : pourquoi y a-t-il une si grande amélioration des performances ?
La raison est en fait très simple. Dans NodeJS, lors d'une transmission http, si le type renvoyé est string
, les paramètres du type string
seront convertis en Buffer, et transmis. Flux NodeJS Stream, renvoyé au client petit à petit. Si on renvoie directement le type Buffer, il n'y aura pas d'opération de conversion et nous reviendrons directement, ce qui réduit le taux de réutilisation du CPU. Cette partie de la logique peut être trouvée dans le code source du nœud https://github.com/nodejs/node/blob/v10.9.0/lib/_http_outgoing.js#L612
Dans l'exemple de comparaison des performances ci-dessus , lors du retour de string
, chaque requête doit remplacer string
par un Buffer et le renvoyer ; lors du retour direct du Buffer, ce Buffer est stocké en mémoire lorsque nous démarrons le service. Chaque requête peut directement renvoyer le Buffer dans le. mémoire, donc Buffer utilise le QPS avant et arrière s'est beaucoup amélioré.
Par conséquent, lorsque nous écrivons du code métier, certaines ressources peuvent être converties à l'avance en types Buffer (tels que js, css et autres fichiers de ressources statiques), et le tampon peut être directement renvoyé au client par exemple. , dans certains scénarios de transfert de fichiers, le contenu obtenu est stocké dans un tampon et transmis directement pour éviter des opérations de conversion supplémentaires.
Recommandations associées :
Explication détaillée du module Buffer dans NodeJS_node.js
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!