2009-04-23 16 views
8

¿Cuál es el tamaño del búfer óptimo para su uso con una corriente de HttpWebResponse.GetResponseStream()?tamaño del búfer óptimo para la secuencia de respuesta de HttpWebResponse

Los ejemplos en línea varían de 256b a tanto como 5Kb. ¿Lo que da? Supongo que los tamaños del buffer pueden ser situacionales. Si es así, ¿cuáles son las situaciones para usar qué tipo de tamaño de búfer?

Gracias.

Respuesta

6

Realmente, no importa mucho.

Claro, si utiliza buffers realmente pequeños, es posible que tenga que hacer algunas llamadas a través de las capas para obtener los bytes (aunque es probable que la secuencia haga al menos algo de memoria intermedia - No sé lo que es los valores por defecto son). Y claro, si usa buffers realmente grandes, desperdiciará algo de memoria e introducirá algo de fragmentación. Como evidentemente estás haciendo IO aquí, cada vez que ganes modificando los buffers estará dominado por el tiempo de IO.

Como regla general, voy con una potencia de dos entre 2048 (2k) y 8192 (8k). Solo asegúrate de saber lo que estás haciendo si vas con un búfer igual o superior a 85,000 bytes (es entonces un "large object" and subject to different GC rules).

De hecho, más importante que el tamaño del búfer es el tiempo que mantenga la misma. Para los objetos que se encuentran fuera del gran montón de objetos, el GC es muy bueno para tratar con objetos muy efímeros (las colecciones Gen 0 son rápidas) o los objetos muy longevos (Gen 2). Los objetos que viven lo suficiente como para llegar a Gen 1 o 2 antes de ser liberados son comparativamente más costosos y, por lo general, vale más la pena preocuparse por su tiempo que lo grande que es el buffer.

Una última nota: si cree que tiene un problema de rendimiento debido al tamaño de los búferes que está utilizando, pruebe. Es poco probable, pero quién sabe, tal vez tenga una extraña confluencia de la versión del sistema operativo, el hardware de red y la versión del controlador que tiene algún problema extraño con los almacenamientos intermedios de cierto tamaño.

+1

Publicación muy útil, pero creo que se refería a 8192? Potencia de 2's -> 2048, 4096, 8192 (8k). – Derrick

3

Mi experiencia anecdótica ha sido que realmente depende de lo que está haciendo, pero típicamente cualquier cosa en el rango de 1024-4096 bytes (1-4KB también conocido como potencia de dos) me daría un rendimiento comparable (con 4KB siendo el el "mejor" número que he visto).

Básicamente, usted quiere un buffer lo suficientemente grande como para que no se innecesariamente la lectura de datos de la corriente, pero no tan grande que disminuyen los rendimientos. Si su memoria intermedia es demasiado grande (~ MB), aumentará la memoria caché no se detecta, lo que en realidad podría comenzar a disminuir su rendimiento. Por supuesto, esto varía mucho en función de H/W real (velocidad de bus, tamaño de caché, etc.), pero parece que hubo casos en que un búfer de 4MB fue más lento que el búfer de 4KB (ambos casos tenían vidas largas, por lo que GC no un problema).

Como señala Jonathan, prueba de su aplicación actual antes de intentar optimizaciones prematuros.

2

En realidad estoy teniendo problemas cuando el tamaño del búfer es demasiado pequeño. Lo probé y lo VERIFICÉ que el tamaño del búfer no debe establecerse como de pequeño valor. En mi ejemplo, lo configuré en 2048 y la descarga se está volviendo MUY LENTA en comparación con Firefox uno (Firefox uno también tiene segmentación de descarga, la misma que la mía).

y después de que se establece en un tamaño grande 409600, la descarga es mucho más rápido, creo que esa llamada extra de gastos generales o tal que hace que la descarga lenta. Quizás en el nivel de red, el búfer está excediendo el tamaño de su búfer, por lo que el TCP necesita solicitar volver a enviar el paquete. (Solo supongo, ya que no sé cómo funciona TCP), sin embargo, el pequeño tamaño del búfer definitivamente está frenando mi descarga. Lo he probado ejecutando usando la descarga predeterminada de Firefox (sin agregar y segmentar) y usando mi clase, ambos son demasiado diferentes.

Ahora es mucho más rápido, cada vez que se realiza un bucle, se lee sobre 200,000 bytes (200 KB) como la conexión aquí es tranquilo rápido, pero después me postulo dos hilos, será mucho más lenta, probablemente tendrá que compartir con otro hilo.

+0

Me pasó lo mismo en el caso de cargar un archivo grande (2Gb): un buffer más grande lo hizo mucho más rápido –

Cuestiones relacionadas