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:
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.
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.
Afaik, endl spült auch den Stream, was die Ursache für die Leistungseinbußen sein kann.
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'
: -)
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.
Tags und Links c++ performance iostream