T
Incocnito schrieb:
Das Problem ist nur, dass die spezifische Implementierung den Puffer beim Overflow einfach neu setzen kann.
Also das hör ich zum ersten mal. Ansonsten hätte ich gesagt, ich weise dem Ofstreamobjekt einfach nen neuen Buffer zu und überschreib dabei die overflow Funktion. Nur keine Ahnung wie die da aussieht..
Kann man bei ofstream überhaupt nen neuen streambuf zuweisen?
Schau mal da: http://www.cplusplus.com/reference/iostream/streambuf/pubsetbuf/: "although specific implementations may vary". Daraus lese ich, dass die spezifische Implementierung davon abweichen kann. Und die streambufs, die ich geschrieben habe, würden auch nicht darauf reagieren. Aber ansonsten hast Du dennoch recht. Das:
clock.start();
{
std::ofstream out;
out.rdbuf()->pubsetbuf(0, 0);
out.open("out4.txt");
for (unsigned n = 0; n < lines; ++n)
out << "Hello\n";
}
cxxtools::Timespan t4 = clock.stop();
ergibt dann das:
$ ./flushtest -n 1000000
flush per line: 1.162 s
without flush: 0.031 s
unbuffered: 0.617 s
unbuffered stream: 1.174 s
Also die performance des flush pro Zeile. Interessanterweise wird aber nicht bei jedem Zeichen geflushed sondern bei jeder Ausgabe. Bei ungepuffert hätte ich erwartet, dass jedes einzelne Zeichen einen overflow auslöst. Dem ist aber nicht so. Dennoch gibt es einen Unterschied. Ich schaue mir mit strace die Systemaufrufe an. Bei Fall 1, also der endl-Fall, wird so geschrieben: write(3, "Hello\n", 6) = 6 , bei Fall 4, also diesen forcierten ungepufferten Schreiben sehe ich das: writev(3, [{NULL, 0}, {"Hello\n", 6}], 2) = 6 .