¿Utiliza la escritura de archivos de C ++ ofstream un búfer?

A continuación se muestran dos programas que escriben 50,000,000 bytes en un archivo.

El primer programa, escrito en C, utiliza un búfer, que una vez rellenado a un valor arbitrario, escribe en el disco y luego repite ese proceso hasta que se escriben los 50,000,000 bytes. Noté que a medida que aumentaba el tamaño del búfer, el programa tardaba menos tiempo en ejecutarse. Por ejemplo, en BUFFER_SIZE = 1, el programa tomó ~ 88.0463 segundos, mientras que en BUFFER_SIZE = 1024, el programa solo tomó ~ 1.7773 segundos. El mejor momento que grabé fue cuando BUFFER_SIZE = 131072. A medida que el BUFFER_SIZE aumentaba más que eso, noté que comenzó a tardar un poco más.

El segundo programa, escrito en C ++, utiliza ofstream para escribir un byte a la vez. Para mi sorpresa, el programa solo tomó ~ 1.87 segundos para ejecutarse. Esperaba que tomara más o menos un minuto, como el programa C con BUFFER_SIZE = 1. Obviamente, el C ++ ofstream maneja la escritura de archivos de manera diferente de lo que pensaba. De acuerdo con mis datos, se está comportando de manera muy similar al archivo C con BUFFER_SIZE = 512. ¿Utiliza algún tipo de búfer detrás de las escenas?

Aquí está el programa C:

<code>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);
}
</code>

Aquí está el programa de C ++:

<code>int main()
{
    ofstream ofs("/tmp/iofile2");
    int i;

    for(i=0; i<50000000; i++)
        ofs << '\0';

    ofs.flush();
    ofs.close();

    return 0;
}
</code>

Gracias por tu tiempo.

Respuestas a la pregunta(3)

Su respuesta a la pregunta