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):
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.