Czy zapisywanie plików z Cstream ofstream używa bufora?
Poniżej znajdują się dwa programy, które zapisują 50 000 000 bajtów do pliku.
Pierwszy program, napisany w języku C, wykorzystuje bufor, który po wypełnieniu do dowolnej wartości zapisuje na dysku, a następnie powtarza ten proces, aż wszystkie 50 000 000 bajtów zostaną zapisane. Zauważyłem, że gdy zwiększyłem rozmiar bufora, uruchomienie programu zajęło mniej czasu. Na przykład w BUFFER_SIZE = 1 program trwał ~ 88,0463 sekund, podczas gdy w BUFFER_SIZE = 1024 program trwał tylko ~ 1,7773 sekundy. Najlepszy czas, jaki zarejestrowałem, to kiedy BUFFER_SIZE = 131072. Ponieważ BUFFER_SIZE wzrosło wyżej, zauważyłem, że zaczęło to trwać trochę dłużej.
Drugi program, napisany w C ++, wykorzystuje strumień do zapisania jednego bajtu na raz. Ku mojemu zdziwieniu, uruchomienie programu zajęło tylko ~ 1,87 sekundy. Spodziewałem się, że zajmie to około minuty, jak program C z BUFFER_SIZE = 1. Oczywiście C ++ ofstream obsługuje zapisywanie plików inaczej niż myślałem. Według moich danych, działa bardzo podobnie do pliku C z BUFFER_SIZE = 512. Czy korzysta z jakiegoś bufora za kulisami?
Oto program 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>
Oto program 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>
Dziękuję za Twój czas.