Maison  >  Article  >  interface Web  >  Qu’est-ce que Buffer ? Explication détaillée de la façon d'utiliser Buffer et exemples de scénarios d'utilisation spécifiques

Qu’est-ce que Buffer ? Explication détaillée de la façon d'utiliser Buffer et exemples de scénarios d'utilisation spécifiques

伊谢尔伦
伊谢尔伦original
2017-07-24 11:03:124993parcourir

JavaScript est très convivial pour le traitement des chaînes. Qu'il s'agisse d'un octet large ou d'une chaîne à un octet, elle est considérée comme une chaîne. Node doit traiter les protocoles réseau, faire fonctionner des bases de données, traiter des images, télécharger des fichiers, etc. Il doit également traiter une grande quantité de données binaires. Les chaînes intégrées sont loin de répondre à ces exigences, c'est pourquoi Buffer a vu le jour.

Structure du tampon

Buffer est un module typique qui combine Javascript et C++. Les parties liées aux performances sont implémentées en C++, et les parties non liées aux performances. les parties associées sont implémentées en javascript.

Node a déjà chargé le Buffer dans la mémoire au démarrage du processus et le place dans l'objet global, il n'est donc pas nécessaire de requérir

Objet Buffer : similaire à un tableau, ses éléments sont des chiffres hexadécimaux à deux chiffres.

Allocation de mémoire tampon

L'allocation de mémoire de l'objet Buffer n'est pas dans la mémoire tas de V8, et l'application mémoire est implémentée au niveau C++ de Node.

Afin d'utiliser efficacement la mémoire demandée, Node adopte le mécanisme d'allocation slab est un mécanisme de gestion dynamique de la mémoire qui s'applique à différents systèmes d'exploitation *nix. La dalle a trois états :

(1) plein : état entièrement alloué

(2) partiel : état partiellement alloué

(3) vide : état non alloué

Conversion de tampon

Les objets tampon peuvent être convertis en chaînes. Les types d'encodage pris en charge sont les suivants :

ASCII, UTF-8, UTF-16LE/UCS. -2, Base64, Binaire, Hex

Chaîne vers Buffer

nouveau tampon (str, [encodage]), UTF-8 par défaut
buf write(. chaîne, [offset], [longueur], [encodage])

Tampon vers chaîne

buf.toString([encodage], [début], [fin] )

Type d'encodage non pris en charge par Buffer

Déterminez s'il est pris en charge via Buffer.isEncoding(encoding)

iconv-lite : implémentation JavaScript pure, plus légère, meilleures performances , pas besoin de convertir C++ en javascript

iconv : appelez la bibliothèque libiconv de C++ pour terminer

Épissage du tampon

Note "res.on( 'data ', function(chunk) {})", le morceau de paramètre est un objet Buffer. L'utilisation directe de + splicing le convertira automatiquement en chaîne. Pour les caractères à octets larges, des caractères tronqués peuvent être générés,

Solution :

(1) Grâce à la méthode setEncoding() dans le flux lisible, cette méthode permet à l'événement de données d'être délivré non plus sous forme d'objet Buffer, mais sous forme de chaîne codée. Le module est utilisé en interne.

(2) Stockez temporairement l'objet Buffer dans un tableau, et enfin assemblez-le dans un grand Buffer, puis encodez-le dans une chaîne pour la sortie.

Le tampon est largement utilisé dans les E/S de fichiers et les E/S réseau. Ses performances sont très importantes et ses performances sont bien supérieures à celles des chaînes ordinaires.

En plus de la perte de performances lors de la conversion des chaînes, l'utilisation de Buffer a un paramètre highWaterMark qui est crucial pour les performances lors de la lecture de fichiers.

a. Le paramètre highWaterMark a un certain impact sur l'allocation et l'utilisation de la mémoire tampon.

b. Si highWaterMark est trop petit, cela peut provoquer trop d'appels système.

Quand utiliser le tampon et quand ne pas l'utiliser ------ Le javascript pur prend en charge le code Unicode mais pas le binaire Lorsqu'il s'agit d'un flux TCP ou d'un flux de fichier, il est nécessaire de traiter le flux. , lorsque nous enregistrons des chaînes non utf-8, binaires et autres formats, nous devons utiliser "Buffer".

Exemple d'introduction

 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 !") ;

Voici les résultats en cours d'exécution :

La vitesse de lecture de la chaîne est nettement plus rapide, le tampon nécessite également l'opération toString(). Par conséquent, lorsque nous enregistrons une chaîne, nous devons utiliser une chaîne ou une chaîne. Même si une grande chaîne est épissée en une chaîne, la vitesse d'épissage ne sera pas plus lente que celle du tampon.

Alors, quand devons-nous à nouveau utiliser le tampon ? Lorsqu'il n'y a pas d'autre moyen, lorsque nous enregistrons des chaînes non utf-8, des formats binaires et autres, nous devons l'utiliser.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn