fstream schreibt nur 4K Blöcke



  • Hallo,

    ich habe gerade bemerkt, dass std::fstream::write scheinbar immer nur 4K Blöcke schreibt (gesehen mit Process Monitor), auch wenn ich einen viel größeren Buffer übergebe.
    Somit sind es auch nur ca. 30MB/sec auf eine HDD.

    Wenn ich aber zB. eine Datei kopiere (Windows), sehe ich in Process Monitor lauter WriteFile mit 64K Blöcken und es kommen ca. 100MB/sec zusammen.

    Was ist da los? Kann man irgendwie die fstream-interne buffer size setzen? Oder muss ich WinAPI (also WriteFile) verwenden?

    Danke.



  • Aha, buffer setzen geht scheinbar so:

    stream.rdbuf()->pubsetbuf(buffer, length);

    Nun.. das funktioniert. Komischerweise wird hier jedoch von gegenteiliger Performance berichtet (also schneller ohne pubsetbuf):

    http://stackoverflow.com/questions/12997131/stdfstream-buffering-vs-manual-buffering-why-10x-gain-with-manual-buffering

    Kann sich das jemand erklären?

    Und angeblich soll man pubsetbuf() noch vor einem open() (bzw. open-constructor) schreiben.
    Dann hat es bei mir jedoch gar keinen Effekt!

    😕



  • Ok ich merk gerade, selbst mit einem 128K buffer ist das Schreiben um ca. 30% langsamer (ich schreibe ein paar 1GB Dateien hintereinander).

    Ist wohl der fstream-Overhead? Oder weil Windows copy file asynchrones WriteFile nutzt?

    Hmm.. ich denke mal wenn man Performance will, muss man WinAPI nehmen.


Log in to reply