Использует ли C ++ ofstream для записи файлов буфер?

Ниже приведены две программы, которые записывают 50 000 000 байтов в файл.

Первая программа, написанная на C, использует буфер, который однажды заполняется до произвольного значения, записывает на диск и затем повторяет этот процесс до тех пор, пока не будут записаны все 50 000 000 байтов. Я заметил, что когда я увеличил размер буфера, программе потребовалось меньше времени для запуска. Например, при BUFFER_SIZE = 1 программе потребовалось ~ 88,0463 секунды, тогда как при BUFFER_SIZE = 1024 программе потребовалось всего ~ 1,7773 секунды. Лучшее время, которое я записал, было, когда BUFFER_SIZE = 131072. Когда BUFFER_SIZE увеличился выше, я заметил, что на самом деле это заняло немного больше времени.

Вторая программа, написанная на C ++, использует ofstream для записи по одному байту за раз. К моему удивлению, запуск программы занял всего ~ 1,87 секунды. Я ожидал, что это займет минуту или около того, как программа C с BUFFER_SIZE = 1. Очевидно, что C ++ ofstream обрабатывает запись файла иначе, чем я думал. По моим данным, он работает примерно так же, как файл C с BUFFER_SIZE = 512. Использует ли он какой-то закулисный буфер?

Вот программа на 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>

Вот программа на 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>

Спасибо за ваше время.

Ответы на вопрос(3)

Ваш ответ на вопрос