Warum wird endl als Synonym für "\ n" verwendet, obwohl es zu erheblichen Leistungseinbußen führt?

8

Dieses Programm:

%Vor%

wenn die Zeit wie folgt ist:

%Vor%

benötigt 15,4 Sekunden Echtzeit, um ausgeführt zu werden. Ersetzen Sie die Ausgabezeile wie folgt: cout << i << ": " << msg << endl; und Sie erhalten dann etwas wie folgt:

%Vor%

Wie Sie sehen können, läuft die Zeit mehr als doppelt, und das Programm geht von minimaler Zeit im Betriebssystem zu fast der Hälfte seiner Zeit im Betriebssystem.

Beide Versionen des Programms haben einen identischen Ausgang und werden vom Standard garantiert, dass sie auf jeder Plattform den gleichen Ausgang haben.

Warum verwenden die Leute weiterhin endl als Synonym für '\n'?

?

Edit: Falls es nicht offensichtlich ist, soll diese Frage eine Leitfrage sein und dient hier zu Lehrzwecken. Ich weiß, warum die Leistung Strafe besteht.

    
Omnifarious 23.01.2010, 11:35
quelle

6 Antworten

21

Ich bin mir nicht sicher. Das Einfügen von std::endl in den Ausgabestream wird als äquivalent zum Einfügen von .widen('\n') und anschließendem Aufruf von flush() definiert, und dennoch verwenden viele Programmierer std::endl auch dann, wenn kein Grund zum Leeren besteht, beispielsweise sofort etwas anderes ausgeben.

Meine Annahme ist, dass es von einer falschen Annahme herrührt, dass es irgendwie portabler ist, weil es nicht explizit einen bestimmten Newline-Charakter verwendet. Dies ist falsch, da \n immer der korrekten Newline-Sequenz des Systems für nicht-binäre Dateien durch die Stream-Bibliothek zugeordnet werden muss.

    
Charles Bailey 23.01.2010, 11:43
quelle
4

Afaik, endl spült auch den Stream, was die Ursache für die Leistungseinbußen sein kann.

    
helpermethod 23.01.2010 11:39
quelle
4

Nicht jeder kümmert sich so sehr um die Leistung. Für einige Anwendungen ist es viel wichtiger, den Stream zu garantieren.

Bearbeiten: Außerdem finde ich endl einfacher zu tippen als '\n' : -)

    
anon 23.01.2010 11:39
quelle
2

Ich neige dazu, endl mit stringstreams zu verwenden, da es so einfach ist, fehlende Zeilenumbrüche zu erkennen.

    
josefx 23.01.2010 12:08
quelle
2

Ich nehme an, dass Lehrtexte std::endl verwenden mit dem Glauben, dass es für Anfänger einfacher und weniger verwirrend ist, und danach haben sich Leute daran gewöhnt, es zu benutzen.

    
jamesdlin 23.01.2010 12:44
quelle
0

Die eigentliche Frage ist, warum hat der Compiler so ein Hundefrühstück gemacht, um die Endversion zu kompilieren? Wenn sie garantiert die gleiche Semantik haben, sollten sie auch die gleiche Laufzeit haben.

Edit: Offensichtlich war mir nicht bewusst, dass endl den Stream flushed ... das ist, was Sie dafür bekommen, es nicht zu suchen.

    
Andrew McGregor 23.01.2010 11:38
quelle

Tags und Links