Ich habe mich gefragt, was die effizienteste Art ist, eine neue Zeile auf der Konsole auszugeben. Bitte erklären Sie, warum eine Technik effizienter ist. Leistungsfähig.
Zum Beispiel:
%Vor%Die Motivation für diese Frage ist, dass ich selbst Schleifen mit Ausgängen schreibe und nach allen Iterationen der Schleife eine neue Zeile ausgeben muss. Ich versuche herauszufinden, was der effizienteste Weg ist, dies zu tun, vorausgesetzt, dass nichts anderes zählt. Diese Annahme, dass nichts anderes zählt, ist wahrscheinlich falsch.
Die Antwort auf diese Frage ist wirklich "es kommt darauf an".
Unabhängig davon, ob Sie nur die Leistung eines '\n'
-Zeichens auf das Standard-Ausgabegerät schreiben, das Gerät nicht anpassen, nicht die Pufferung ändern - dann ist es schwer, Optionen wie
Das Problem ist, dass dies nicht viel bringt - alles was es tut (vorausgesetzt, die Ausgabe ist für einen Bildschirm oder ein sichtbares Anwendungsfenster) ist, den Cursor auf dem Bildschirm nach unten zu bewegen und die vorherige Ausgabe nach oben zu bewegen. Nicht gerade eine unterhaltsame oder anderweitig wertvolle Erfahrung für einen Benutzer Ihres Programms. Also wirst du das nicht isoliert tun.
Aber was kommt ins Spiel, um die Leistung zu beeinflussen (wie auch immer Sie das messen), wenn wir keine Zeilenumbrüche isoliert ausgeben? Mal sehen;
stdout
(oder std::cout
) ist standardmäßig gepuffert. Damit die Ausgabe sichtbar ist, umfassen die Optionen das Deaktivieren der Pufferung oder das periodische Löschen des Puffers durch den Code. Es ist auch möglich, stderr
(oder std::cerr
) zu verwenden, da dies standardmäßig gepuffert ist - vorausgesetzt, dass stderr
ebenfalls an die Konsole geleitet wird und die Ausgabe dieselben Leistungsmerkmale wie stdout
hat. stdout
und std::cout
werden standardmäßig formal synchronisiert (z. B. std::ios_base::sync_with_stdio
nachschlagen), um das Mischen der Ausgabe mit stdout
und std::cout
zu ermöglichen (dasselbe gilt für stderr
und std::cerr
) Das Obige ist nur eine Auswahl, aber es gibt zahlreiche Faktoren, die bestimmen, was als mehr oder weniger Leistung angesehen werden kann.
putchar('\n')
ist am einfachsten und wahrscheinlich am schnellsten. cout
und printf
mit der Zeichenfolge "\n"
arbeiten mit null terminierten Strings und dies ist langsamer, weil Sie 2 Bytes verarbeiten (0A 00). Der Wagenrücklauf ist übrigens \r
= 13 (0x0D). \n
code ist Zeilenvorschub (LF).
Sie geben nicht an, ob Sie fordern, dass die Aktualisierung auf dem Bildschirm sofort erfolgt oder bis zum nächsten Flush verschoben wird. Deshalb:
wenn Sie iostream io verwenden:
%Vor%Wenn Sie stdio io:
verwenden %Vor%Es ist tatsächlich abhängig von der OS / Compiler-Implementierung.
Die effizienteste , garantierteste Methode zur Ausgabe eines '\n'
Newline-Zeichens ist die Verwendung von std::ostream::write()
(und für einige Systeme wird std::ostream
in std::ios_base::binary
Modus):
Unter Ubuntu 15.10, g ++ v5.2.1 (und einem älteren vxWorks und OSE)
Es ist einfach, das zu demonstrieren
%Vor%fügt ein neues Zeilenzeichen in den Ausgabepuffer ein und löscht den Puffer anschließend auf dem Gerät.
Aber
%Vor%fügt ein neues Zeilenkürzel in den Ausgabepuffer ein und gibt es nicht auf dem Gerät aus. Einige zukünftige Aktionen werden benötigt, um die Ausgabe des Charts newline im Puffer zum Gerät auszulösen.
Zwei solche Aktionen sind:
%Vor%Es gibt auch einige andere Aktionen, die das Flush der Pufferung std :: cout auslösen können.
%Vor%Und nach einem Kommentar von jemandem, der weiß (ich kann seinen Namen hier nicht kopieren), gibt es Ausnahmen für einige Umgebungen.
Ich würde vorschlagen zu verwenden:
%Vor%oder
%Vor%Und schalten Sie die Optimierung ein und lassen Sie den Compiler entscheiden, was der beste Weg ist, um diesen trivialen Job zu machen.
Tags und Links c++