A escrita do arquivo C ++ ofstream usa um buffer?

Abaixo estão dois programas que gravam 50.000.000 bytes em um arquivo.

O primeiro programa, escrito em C, utiliza um buffer, que uma vez preenchido com um valor arbitrário, grava em disco e repete esse processo até que todos os 50.000.000 bytes sejam gravados. Notei que, conforme aumentava o tamanho do buffer, o programa levava menos tempo para ser executado. Por exemplo, em BUFFER_SIZE = 1, o programa demorou ~ 88,0463 segundos, enquanto em BUFFER_SIZE = 1024, o programa levou apenas ~ 1,7773 segundo. A melhor época que gravei foi quando BUFFER_SIZE = 131072. À medida que o BUFFER_SIZE aumentava mais do que isso, notei que ele realmente demorou um pouco mais.

O segundo programa, escrito em C ++, utiliza o ofstream para escrever um byte de cada vez. Para minha surpresa, o programa levou apenas ~ 1.87 segundos para ser executado. Eu esperava que levasse um minuto ou mais, como o programa C com BUFFER_SIZE = 1. Obviamente, o C ++ ofstream lida com arquivos de forma diferente do que eu pensava. De acordo com os meus dados, ele está sendo executado de maneira muito semelhante ao arquivo C com BUFFER_SIZE = 512. Ele usa algum tipo de buffer nos bastidores?

Aqui está o 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>

Aqui está o programa 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>

Obrigado pelo seu tempo.

questionAnswers(3)

yourAnswerToTheQuestion