Verwendet C ++ für das Schreiben von Stream-Dateien einen Puffer?

Unten sehen Sie zwei Programme, die 50.000.000 Bytes in eine Datei schreiben.

Das erste in C geschriebene Programm verwendet einen Puffer, der, sobald er auf einen beliebigen Wert gefüllt ist, auf die Festplatte schreibt und diesen Vorgang wiederholt, bis alle 50.000.000 Bytes geschrieben sind. Als ich den Puffer vergrößerte, bemerkte ich, dass die Ausführung des Programms weniger Zeit in Anspruch nahm. Beispielsweise dauerte das Programm bei BUFFER_SIZE = 1 ~ 88,0463 Sekunden, während das Programm bei BUFFER_SIZE = 1024 nur ~ 1,7773 Sekunden dauerte. Die beste Zeit, die ich aufgezeichnet habe, war BUFFER_SIZE = 131072. Als BUFFER_SIZE höher stieg, bemerkte ich, dass es tatsächlich etwas länger dauerte.

Das zweite in C ++ geschriebene Programm verwendet ofstream, um jeweils ein Byte zu schreiben. Zu meiner Überraschung dauerte die Ausführung des Programms nur ~ 1,87 Sekunden. Ich habe damit gerechnet, dass es ungefähr eine Minute dauert, wie das C-Programm mit BUFFER_SIZE = 1. Offensichtlich behandelt der C ++ ofstream das Schreiben von Dateien anders als ich dachte. Meinen Daten zufolge verhält es sich ziemlich ähnlich wie die C-Datei mit BUFFER_SIZE = 512. Verwendet es eine Art Hintergrundpuffer?

Hier ist das C-Programm:

<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>

Hier ist das C ++ - Programm:

<code>int main()
{
    ofstream ofs("/tmp/iofile2");
    int i;

    for(i=0; i<50000000; i++)
        ofs << '\0';

    ofs.flush();
    ofs.close();

    return 0;
}
</code>

Vielen Dank für Ihre Zeit.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage