2010-06-30 22 views
8

Tengo una pregunta sobre el uso del búfer con StreamReader. Aquí : http://msdn.microsoft.com/en-us/library/system.io.streamreader.aspx se puede ver:StreamReader y búfer en C#

"Cuando se lee de una corriente, es más eficaz utilizar un búfer que es del mismo tamaño que el búfer interno de la corriente.".

De acuerdo con esta weblog, el tamaño del buffer interno de un StreamReader es 2k, por lo que se puede leer de manera eficiente un archivo de algunos kbs utilizando el Read() evitando la Read(Char[], Int32, Int32).

Por otra parte, aunque el archivo es grande puedo construir el StreamReader pasando un tamaño para el buffer

¿Cuál es la necesidad de un tampón externo?

Respuesta

1

creo que esta pregunta ya se le pidió alguna manera diferente en stackoverflow: How to write the content of one stream into another stream in .net?

"Cuando se utiliza el método Read, es más eficaz utilizar un búfer que es del mismo tamaño que el búfer interno de la corriente, donde el búfer interno se establece en el tamaño de bloque deseado, y para leer siempre menos que el tamaño del bloque. Si el tamaño del búfer interno no se especificó cuando se construyó la secuencia, su tamaño predeterminado es 4 kilobytes (4096 bytes) ".

4

En cuanto a la implementación de los métodos StreamReader.Read, puede ver que ambos llaman al método interno ReadBuffer.

Read() método primero lee en el búfer interno, luego avanza en el búfer uno por uno.

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[]...) llama al ReadBuffer también, pero en su lugar en la memoria intermedia externa proporcionada por la persona que llama:

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; 
    } 
}

así que supongo que la única pérdida de rendimiento es que se necesita llamar Read() tiempos mucho más que Read(char[]) y como es un método virtual, las llamadas en sí lo ralentizan.

Cuestiones relacionadas