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.
grep
,cp
)read
/write
funciones o ANSI / ISO / IECfread
/fwrite
funciones?Respuestas:
Las
fread/fwrite
funciones 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/write
funciones 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.
fuente
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?