2010-06-30 10 views
8

J'ai une question sur l'utilisation du tampon avec StreamReader. Ici: http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx vous pouvez voir:StreamReader et le tampon en C#

« Lors de la lecture d'un flux, il est plus efficace d'utiliser un tampon qui est la même taille que la mémoire tampon interne du flux. ».

Selon cette weblog, la taille de la mémoire tampon interne d'un StreamReader est 2k, donc je peux efficacement lire un fichier de quelques kbs en utilisant le Read() évitant le Read(Char[], Int32, Int32).

De plus, même si un fichier est grand, je peux construire le StreamReader passer une taille pour la buffer

Alors, quel est le besoin d'un tampon externe?

Répondre

1

Je pense que cette question a déjà été posée en quelque sorte différemment stackoverflow: How to write the content of one stream into another stream in .net?

« Lorsque vous utilisez la méthode Read, il est plus efficace d'utiliser un tampon qui est la même taille que la mémoire tampon interne du flux, où le tampon interne est défini sur la taille de bloc souhaitée et toujours inférieur à la taille du bloc Si ​​la taille du tampon interne n'était pas spécifiée lors de la construction du flux, sa taille par défaut est de 4 kilo-octets (4096 octets). "

4

En regardant la mise en œuvre des méthodes StreamReader.Read, vous pouvez voir qu'ils appellent tous deux la méthode interne ReadBuffer. La méthode lit d'abord en tampon interne, puis avance un à un sur le tampon.

public override int Read() 
{ 
    if ((this.charPos == this.charLen) && (this.ReadBuffer() == 0)) 
    { 
     return -1; 
    } 
    int num = this.charBuffer[this.charPos]; 
    this.charPos++; 
    return num; 
}

Read(char[]...) appelle la ReadBuffer aussi, mais à la place dans la mémoire tampon externe fournie par l'appelant:

public override int Read([In, Out] char[] buffer, int index, int count) 
{ 
    while (count > 0) 
    { 
     ... 
     num2 = this.ReadBuffer(buffer, index + num, count, out readToUserBuffer); 
     ... 
     count -= num2; 
    } 
}

donc je suppose que la seule perte de performance est que vous devez appeler Read() fois beaucoup plus que Read(char[]) et Comme c'est une méthode virtuelle, les appels eux-mêmes la ralentissent.