2010-12-08 4 views
4

Cette question est assez récente, mais je n'ai trouvé aucune réponse fiable via Google/SO/Etc.Exécution de .replace() sur le contenu de la mémoire tampon (Node.js)?

Si vous avez du contenu dans une mémoire tampon, ce qui est le meilleur modèle pour l'exécution d'un .replace() sur ce contenu?

Vous tirez simplement le contenu avec .toString(), exécutez replace(), puis remettez-le dans le tampon? Ou y a-t-il un meilleur moyen?

Merci

+0

@Gaby Merci. Je fais habituellement ça. Dans l'urgence cet après-midi. :) – Spot

Répondre

3

dépend de ce que vous voulez remplacer, Buffers ne réaffecte pas les soi-même, l'objet Buffer vous en JavaScript est simplement un « pointeur » dans une zone de mémoire externe (je parle en particulier à propos de Node.js 3.x ici, les anciens "SlowBuffers" de 2.x fonctionnent différemment).

Donc, il y a deux scénarios possibles:

  1. votre longueur de la valeur de remplacement est <> la valeur qui est remplacée. Dans ce cas, il n'y a pas grand-chose que vous pouvez faire, vous devez utiliser toString() qui alloue une nouvelle String (indice: lent), puis créer une nouvelle Buffer en fonction de la taille de cette chaîne.

  2. Vous êtes juste octets swapping ([] sur les tampons est pas un indice de caractère) ici, il sera beaucoup plus rapide serait plus rapide sur 2.x juste utiliser une boucle simple, et effectuer le remplacement de votre self, car il n'y a presque aucun surcoût d'allocation (Node alloue un nouvel int avec la même valeur que celle qui a été écrite) mais sur 3.x toString est correct pour 99% du temps.

Mais ce que vous voulez vraiment surveiller est que vous n'écrivez pas des chaînes gigantesques à des prises, parce que ce vraiment lent sous 2.x.
En raison du fait que V8 peut déplacer les chaînes en mémoire à tout moment, 2.x nœud doit les copier avant leur passage pointeur vers le système d'exploitation. Cela a été corrigé avec quelques hacks sur V8 dans 3.x.

+0

En fait, nous utilisons cela en production. Nous sommes donc encore en 2.x – Spot

+0

Alors la version 'toString()' sera encore plus lent, car l'allocation de mémoire tampon après prendra encore plus longtemps, buffers 3.x Node sont plus rapides 10x puis dans 2.x. Donc, si vous pouvez aller avec l'approche '[]'. Mais à la fin tout se résume à savoir si cela est essentiel à la performance, à moins que vous ne le fassiez à 2000x par requête, je ne pense pas que cela aura un impact. De même, le vrai goulot d'étranglement n'est pas lorsqu'on écrit des chaînes sur des sockets dans 2.x car elles doivent être copiées pour que le noyau puisse les lire en toute sécurité. V8 pourrait les déplacer et donc invalider le pointeur, donc la copie. –

Questions connexes