La Réutilisation De La Mémoire De Flux
Supposons je l'ai copié d'un tampon d'octets dans un flux de mémoire à l'aide de cette
memoryStream.Read(data, 0, data.Length);
Est-il de toute façon pour moi de vider le flux et le réutiliser pour lire des données supplémentaires?
Je veux éviter de créer de nombreux MemoryStream objets et préfèrent utiliser une instance, le remettre entre les usages
OriginalL'auteur Jack Kada | 2011-04-24
Vous devez vous connecter pour publier un commentaire.
Vous pouvez définir la
Position
à 0, cela aura pour effet de réinitialiser le flux.Cependant, comme cette réponse indique, la réutilisation de la mémoire de flux ne sera pas susceptible de gagner des avantages de performances. Il est moins cher de créer plus de mémoire ruisseaux.
Une autre option pour utiliser un épinglé
byte[]
que votre tampon pour la réutilisation.il ya une raison pourquoi la réinitialisation/effacement de la mémoire des flux n'est pas construit dans. Voir le lié réponse que j'ai ajouté.
Si vous allouer un tampon de grande il serait plus efficace de la réutilisation de la mémoire tampon vs réaffectation à chaque fois. Plutôt que de définir la position que vous pouvez utiliser SetLength(0) (voir ma réponse ci-dessous) qui permettra de garder la mémoire tampon allouée et de réinitialiser les compteurs internes, de longueur et de position, qui est moins cher que la réaffectation d'un tampon de grande fréquemment.
La bonne réponse est ci-dessous, SetLength(0). Cette réponse est incorrecte.
OriginalL'auteur
Vous pouvez ré-utiliser le MemoryStream par Réglage de la Position 0 et la Longueur de 0.
Par le réglage de la longueur à 0, vous ne désactivez pas la mémoire tampon existante, il ne réinitialise les compteurs internes. Si la mémoire tampon existante attribution reste intact, mais tout le livre comptable de la façon dont beaucoup de la mémoire tampon est utilisée est remise à zéro de sorte que vous pouvez ré-utiliser.
Mise à jour: j'ai juste pris un coup d'oeil rapide à la mise en œuvre du code de SetLength et si vous définissez la longueur de 0 la Position sera automatiquement remise à 0 de sorte que vous n'avez même pas besoin de définir explicitement la propriété Position, il suffit seulement de réinitialiser la durée.
OriginalL'auteur
Il serait mieux si vous utilisez
memoryStream.getBuffer()
et les décalages/longueur(utilisermemoryStream.Position
etmemoryStream.Length
pour la détection de limites) pour accéder directement àbyte[]
de données,Reader
/Writer
/BinaryFormatter
classes, ou d'autres classes d'accepterStream
, pour la lecture/écriture primitive/types complexes dans le buffer(c'est ce queMemoryStream
est fait pour), vous gérez sans inutile de copier les opérations, carMemoryStream
est déjà à la base de tableau d'octets.J'ai utilisé de cette façon avec asynchrone envoyer/recevoir des opérations de socket accepter
byte[]
, Mais méfiez - vous- si vous avez écrit quelque chose dans le buffer au-delà de sesLength
et que vous souhaitez augmenter sa longueur avecSetLength()
pour les lire avec le Lecteur de la classe, vous avez de très gênant comportement(à mon avis) - cette méthode annule tous les octets entre les anciens de la longueur et de la nouvelle longueur si la longueur augmente.J'ai résolu ce problème en modifiant le code source(un Tableau.Appel clair dans
SetLength()
, et quelques ajouts à gérer sans classes internes .NETTE) deMemoryStream
et de l'utiliser dans mon projet.Comme pour la réutilisation des MemoryStream, je suis d'accord avec Chris Taylor réponse(
SetLength(0)
)OriginalL'auteur
memoryStream.Seek(0, SeekOrigin.Commencer);
OriginalL'auteur