Использует ли 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>
Спасибо за ваше время.