c++ - una - ¿Cuál sería un tamaño de búfer ideal?
señales de que te van a robar (6)
1. ¿Hay alguna razón por la que deba / deba ser una potencia de 2, o esta inclinación natural del programador a las potencias de 2?
Realmente no. Probablemente debería ser algo que vaya incluso en el tamaño del ancho del bus de datos para simplificar la copia de memoria, por lo que cualquier cosa que divida en 16 sería buena con la tecnología actual. El uso de una potencia de 2 hace que sea probable que funcione bien con cualquier tecnología futura.
2. ¿Cuál sería el número "ideal"? Por "ideal" quiero decir que sería el más rápido.
Lo más rápido sería lo más posible. Sin embargo, una vez que supere algunos kilobytes, tendrá una diferencia de rendimiento muy pequeña en comparación con la cantidad de memoria que utiliza.
¿Supongo que tendría que ser un múltiplo del tamaño del búfer del dispositivo subyacente? ¿O tal vez del búfer del objeto de flujo subyacente? ¿Cómo podría determinar cuál es el tamaño de esos buffers, de todos modos?
Realmente no se puede saber el tamaño de los buffers subyacentes, o depender de que sigan siendo los mismos.
Y una vez que lo haga, ¿el uso de un múltiplo aumentaría la velocidad con solo usar el tamaño exacto?
Algunos, pero muy poco.
Posible duplicado:
¿Cómo determina el tamaño de búfer ideal cuando usa FileInputStream?
Cuando se leen datos sin procesar de un archivo (o cualquier flujo de entrada) con la read()
la familia de secuencias de C ++ o con el fread()
C, se debe suministrar un búfer y la cantidad de datos que se deben leer. La mayoría de los programas que he visto parecen elegir arbitrariamente una potencia de 2 entre 512 y 4096.
- ¿Hay alguna razón por la que deba / deba ser una potencia de 2, o esta inclinación natural del programador a las potencias de 2?
- ¿Cuál sería el número "ideal"? Por "ideal" quiero decir que sería el más rápido. ¿Supongo que tendría que ser un múltiplo del tamaño del búfer del dispositivo subyacente? ¿O tal vez del búfer del objeto de flujo subyacente? ¿Cómo podría determinar cuál es el tamaño de esos buffers, de todos modos? Y una vez que lo haga, ¿el uso de un múltiplo aumentaría la velocidad con solo usar el tamaño exacto?
EDITAR
La mayoría de las respuestas parecen ser que no se puede determinar en el momento de la compilación. Estoy bien con encontrarlo en tiempo de ejecución.
- Al menos en mi caso, la suposición es que el sistema subyacente está utilizando un búfer cuyo tamaño es una potencia de dos, también, por lo que es mejor intentarlo y emparejarlo. Creo que hoy en día los buffers deberían ser un poco más grandes de lo que "la mayoría" de los programadores tienden a hacer. Me gustaría ir con 32 KB en lugar de 4, por ejemplo.
- Es muy difícil saber de antemano, por desgracia. Depende de si su aplicación es E / S o CPU enlazada, por ejemplo.
- Creo que en su mayoría es solo elegir un número "redondo". Si las computadoras funcionaran en decimal, probablemente elegiríamos 1000 o 10000 en lugar de 1024 u 8192. No hay una buena razón.
Una posible razón es que los sectores del disco generalmente tienen un tamaño de 512 bytes, por lo que leer un múltiplo de eso es más eficiente, asumiendo que todas las capas de hardware y el almacenamiento en caché hacen que el código de bajo nivel pueda usar este hecho de manera eficiente. Lo cual probablemente no pueda, a menos que esté escribiendo un controlador de dispositivo o haciendo una lectura sin memoria intermedia.
Creo que el tamaño ideal del búfer es el tamaño de un bloque en su disco duro, por lo que puede asignarse correctamente con su búfer mientras almacena o recupera datos del disco duro.
FUENTE:
¿Cómo determina el tamaño de búfer ideal cuando usa FileInputStream?
El tamaño óptimo del búfer está relacionado con varias cosas: el tamaño del bloque del sistema de archivos, el tamaño de la memoria caché de la CPU y la latencia de la memoria caché.
La mayoría de los sistemas de archivos están configurados para usar tamaños de bloque de 4096 u 8192. En teoría, si configura el tamaño de su búfer de modo que esté leyendo unos pocos bytes más que el bloque de disco, las operaciones con el sistema de archivos pueden ser extremadamente ineficientes (es decir, si configuró su búfer para leer 4100 bytes a la vez, cada lectura requeriría 2 lecturas de bloque por el sistema de archivos). Si los bloques ya están en el caché, entonces terminará pagando el precio de RAM -> L3 / L2 latencia de caché. Si no tiene suerte y los bloques aún no están en la memoria caché, pagará el precio del disco-> Latencia de RAM también.
Esta es la razón por la que ve la mayoría de los búferes dimensionados como una potencia de 2, y generalmente más grandes que (o iguales a) el tamaño del bloque de disco. Esto significa que una de sus lecturas de flujo podría dar como resultado múltiples lecturas de bloque de disco, pero esas lecturas siempre usarán un bloque completo, sin lecturas desaprovechadas.
Asegurarse de esto también suele dar como resultado otros parámetros amigables con el rendimiento que afectan tanto a la lectura como al procesamiento posterior: alineación del ancho del bus de datos, alineación DMA, alineación de la línea de memoria caché, número total de páginas de memoria virtual.
No hay razón para que sepa que tiene que ser una potencia de dos. Está limitado por el tamaño del búfer que tiene que estar dentro de max size_t
pero es poco probable que esto sea un problema.
Claramente, cuanto más grande sea el búfer, mejor, pero esto obviamente no es escalable, por lo que se deben tener en cuenta las consideraciones de recursos del sistema en el momento de la compilación o, preferiblemente, en el tiempo de ejecución.