Warum ist ostringstream schneller als ofstream?

8

Um viele Daten in eine Datei zu schreiben, habe ich zwei Ansätze:

  1. Schreibe direkt in den Stream,

    %Vor%
  2. Schreiben Sie zuerst in istringstream und schreiben Sie dann sofort in of ofstream

    %Vor%

Es überrascht nicht, dass der zweite Ansatz schneller ist, tatsächlich ist er viermal schneller als der erste Ansatz auf meiner HP7800-Maschine.

Aber warum? Ich weiß, Ofstream verwendet Filebuf innerhalb, und ostringstream verwendet Stringbuf - als Puffer sollten sie alle im Speicher residieren, sollte also keinen Unterschied haben.

Was ist der Unterschied unter der Haube?

    
Baiyan Huang 04.03.2011, 10:01
quelle

3 Antworten

14

Verwenden Sie std::endl viel statt '\n' ? std::endl hat zwei Dinge: Es fügt einen '\n' in den Stream ein und löscht den Puffer auf die Festplatte . Ich habe gesehen, wie Code einen ernsthaften Leistungseinbruch erlebte. (Der Code lief 5-10 mal schneller, nachdem das behoben wurde.)
Das Spülen zu einem String-Puffer ist viel schneller als das Spülen auf die Festplatte, was Ihre Ergebnisse erklären würde.

Wenn das nicht der Fall ist, können Sie die Puffergröße erhöhen:

%Vor%     
sbi 04.03.2011, 10:06
quelle
4

Festplatte ist langsam. Viele kleine Schreibvorgänge sind teurer als eine große.

    
Erik 04.03.2011 10:05
quelle
2

Dies kann ein Implementierungsproblem mit einem bestimmten Betriebssystem sein. Auch ich denke, der Ofstream-Puffer (buflen) ist kleiner als 10000, ein typischer Wert von denen ist 4095. Also versuchen Sie es mit i & lt; 4096 und die Antwortzeit sollte ganz gleich sein!

Der Grund, warum es im zweiten Fall schneller ist:

Im ersten Fall, wenn der Puffer voll ist (buflen = 4095bytes), wird er auf die Platte geschrieben. Also für i & lt; 10000 hätte es verursacht, dass es dreimal gespült wurde.

Während im zweiten Fall alle Daten zuerst im RAM vorbereitet und auf einmal auf die Festplatte geleert werden. So wurden zwei Flushes gespeichert!

    
user5858 04.03.2011 10:15
quelle

Tags und Links