Di seguito sono riportati due programmi che scrivono 50.000.000 byte in un file.La scrittura di file C++ ofstream utilizza un buffer?
Il primo programma, scritto in C, utilizza un buffer, che una volta riempito con un valore arbitrario, scrive su disco e quindi ripete quel processo finché non vengono scritti tutti i 50.000.000 byte. Ho notato che mentre aumentavo la dimensione del buffer, il programma richiedeva meno tempo per l'esecuzione. Ad esempio, a BUFFER_SIZE = 1, il programma ha richiesto ~ 88,043 secondi, mentre a BUFFER_SIZE = 1024, il programma ha impiegato solo 1,77773 secondi. Il miglior tempo che ho registrato è stato quando BUFFER_SIZE = 131072. Dato che il BUFFER_SIZE è aumentato più in alto di così, ho notato che ha iniziato a richiedere un po 'più di tempo.
Il secondo programma, scritto in C++, utilizza ofstream per scrivere un byte alla volta. Con mia sorpresa, il programma ha impiegato solo 1,87 secondi per funzionare. Mi aspettavo che ci volesse circa un minuto, come il programma C con BUFFER_SIZE = 1. Ovviamente, il C++ ofstream gestisce la scrittura dei file in modo diverso da come pensavo. Secondo i miei dati, sta funzionando in modo abbastanza simile al file C con BUFFER_SIZE = 512. Utilizza una sorta di buffer dietro le quinte?
Ecco il programma C:
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);
}
Ecco il programma C++:
int main()
{
ofstream ofs("/tmp/iofile2");
int i;
for(i=0; i<50000000; i++)
ofs << '\0';
ofs.flush();
ofs.close();
return 0;
}
Grazie per il vostro tempo.
Sì, è tamponato dietro le quinte, come "ofs.flush();" indica. –
Oh! Mi piace molto quando i "nuovi arrivati" fanno questo tipo di domande: dati sperimentali, ipotesi intelligenti, ... Signore, è un piacere averti a bordo! –
Ho sempre sentito 4096 (dimensioni della pagina del sistema operativo) o 8192 (dimensioni della pagina del doppio sistema operativo) erano il numero migliore a cui puntare. Dimensioni più grandi di quelle potrebbero essere più veloci, ma l'aumento di velocità non valeva l'aumento della memoria. –