Tamaño óptimo del búfer para fread / fwrite [cerrado]


10

¿Qué tamaño de búfer debo elegir para leer / escribir archivos a través de las funciones POSIX fread / fwrite?

c 

Esta pregunta está demasiado localizada. Solo se refiere a cualquier programa en particular que esté codificando en este momento.
Ingeniero mundial

Me refiero a un caso general. Muchos programas de necesidades para leer / escribir archivos enteros con tamaño muy desconocida (como grep, cp)

¿Te refieres a POSIX read/ writefunciones o ANSI / ISO / IEC fread/ fwritefunciones?
Jan Hudec

Respuestas:


6

Las fread/fwritefunciones ANSI / ISO están almacenadas en búfer. El búfer suele ser de 8 KiB y eso le da una granularidad independiente de lo que usa en su código. Puede tener sentido aumentar un poco el búfer, tal vez al valor a continuación. Sin embargo, para la transferencia masiva siempre serán un poco más lentos debido a las copias adicionales.

Para las read/writefunciones POSIX , depende del sistema operativo y del dispositivo y de muchas otras cosas, pero la experiencia práctica es que no se mejora el rendimiento al aumentar el búfer más allá de las decenas de KiB, por lo que 32 o 64 KiB es lo correcto.

En algunos sistemas, la dependencia es mayor que en otros. En Linux, la diferencia suele ser mínima por encima de 8 KiB (por lo que el búfer predeterminado está bien), por ejemplo, en Windows CE (usando API nativa; no tienen POSIX) incluso más grande que 64 KiB todavía ayuda. También puede depender del dispositivo.


entonces 8k para E / S con búfer (es decir fread, fwrite) y 32 / 64K para sin búfer? Si se envían datos de imágenes, ¿hay alguna razón específica para elegir con o sin búfer?
Francesco Boi

1
@FrancescoBoi, 8k solo es predeterminado para el búfer que puede cambiar. El objetivo del almacenamiento en búfer es evitar todos los cambios de contexto cuando procesa unos pocos bytes a la vez. Para la imagen que generalmente necesita o tiene todo, y luego sin búfer es mejor ya que omite un poco de procesamiento.
Jan Hudec
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.