A continuación se muestran dos programas que escriben 50,000,000 de bytes en un archivo.¿La escritura de archivo C++ de corriente utiliza un búfer?
El primer programa, escrito en C, utiliza un búfer, que una vez rellenado con un valor arbitrario, escribe en el disco y luego repite ese proceso hasta que se escriben todos los 50,000,000 de bytes. Noté que a medida que aumentaba el tamaño del buffer, el programa tardaba menos tiempo en ejecutarse. Por ejemplo, en BUFFER_SIZE = 1, el programa tardó ~ 88.0463 segundos, mientras que en BUFFER_SIZE = 1024, el programa solo tardó ~ 1.7773 segundos. El mejor momento que grabé fue cuando BUFFER_SIZE = 131072. Como el BUFFER_SIZE aumentó más que eso, noté que comenzó a tomar un poco más de tiempo.
El segundo programa, escrito en C++, utiliza ofstream para escribir un byte a la vez. Para mi sorpresa, el programa solo tardó ~ 1.87 segundos en ejecutarse. Esperaba que tardara un minuto más o menos, como el programa C con BUFFER_SIZE = 1. Obviamente, C++ ofstream maneja la escritura de archivos de forma diferente a lo que pensaba. De acuerdo con mis datos, está funcionando de manera muy similar al archivo C con BUFFER_SIZE = 512. ¿Utiliza algún tipo de memoria intermedia detrás de escena?
Aquí es el programa C:
const int NVALUES = 50000000; //#values written to the file
const char FILENAME[] = "/tmp/myfile";
const int BUFFER_SIZE = 8192; //# bytes to fill in buffer before writing
main()
{
int fd; //File descriptor associated with output file
int i;
char writeval = '\0';
char buffer[BUFFER_SIZE];
//Open file for writing and associate it with the file descriptor
//Create file if it does not exist; if it does exist truncate its size to 0
fd = open(FILENAME, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR);
for(i=0;i<NVALUES;i++)
{
//Package bytes into BUFFER_SIZE chunks
//and write a chunk once it is filled
buffer[i%BUFFER_SIZE] = writeval;
if((i%BUFFER_SIZE == BUFFER_SIZE-1 || i == NVALUES-1))
write(fd, buffer, i%BUFFER_SIZE+1);
}
fsync(fd);
close(fd);
}
Aquí es el programa en C++:
int main()
{
ofstream ofs("/tmp/iofile2");
int i;
for(i=0; i<50000000; i++)
ofs << '\0';
ofs.flush();
ofs.close();
return 0;
}
Gracias por su tiempo.
Sí, está almacenado en segundo plano detrás de escena, como indica 'ofs.flush();'. –
¡Oh! Me gusta mucho cuando los "recién llegados" hacen este tipo de preguntas: datos experimentales, hipótesis inteligentes ... ¡Señor, es un placer tenerte a bordo! –
Siempre he escuchado que 4096 (tamaño de página del sistema operativo) u 8192 (tamaño de página del sistema operativo doble) eran el mejor número para apuntar. Los tamaños más grandes que esos pueden ser más rápidos, pero el aumento en la velocidad no valía el aumento en la memoria. –