2008-09-24 7 views

Respuesta

16

En cuanto al tamaño del búfer ideales:

"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, en el que el buffer interno se establece en su tamaño de bloque deseado, y para leer siempre menos del tamaño de 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) ".

Cualquier proceso de lectura de flujo usará Read (char buffer [], int index, count), que es el método al que se refiere esta cita.

http://msdn.microsoft.com/en-us/library/9kstw824.aspx (En "Observaciones").

7

No estoy seguro de si es posible directamente tubo de una secuencia a otra en .NET, pero aquí hay un método para hacerlo con un byte intermedio buffer. El tamaño del buffer es arbitrario. El tamaño más eficiente dependerá principalmente de la cantidad de datos que transfiere.

static void CopyStream(Stream input, Stream output){ 
    byte[] buffer = new byte[0x1000]; 
    int read; 
    while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
     output.Write(buffer, 0, read); 
} 
+1

Se podría aplicar esto como un método de extensión en C# 3.0, y tenerlo como algo parecido a CopyTo static void (esta entrada corriente, salida de corriente) ... –

2

No conozco una forma más elegante que el uso de un búfer.

Pero el tamaño de un buffer puede hacer la diferencia. ¿Recuerdas los problemas sobre la copia de archivo de Vista? Su motivo fue (básicamente) cambiar el tamaño del búfer. Los cambios se explican en this blogpost. Puedes aprender los principales factores de esa publicación. Sin embargo, esto solo se aplica a la copia de archivos. En aplicaciones, probablemente haga muchas copias de memoria, por lo que en ese caso, el 4KB podría ser el mejor tamaño de búfer, as recommended by the .NET documentation.

68

En .NET 4.0 finalmente obtuvimos un método Stream.CopyTo! ¡Hurra!

+4

Esto es exactamente lo ! –

+2

Descompuse en el método Stream.CopyTo y hace una llamada a "this.InternalCopyTo (destination, 81920);" El valor entero es el tamaño del búfer. Parece un tamaño de búfer loco comparado con el 4k estándar que la mayoría de las técnicas de búfer parecen emplear. ¿Alguien puede comentar sobre esto? – ctrlplusb

+2

Parece que ese número solo trata de evitar el uso del montón de objetos grandes, que se activaría ligeramente al norte de esa cantidad. –

5

BufferedStream.CopyTo (Stream)

Cuestiones relacionadas