Der effizienteste Weg, um einen Zeilenumbruch auszugeben

7

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.

    
Harrison Tran 13.05.2016, 19:33
quelle

6 Antworten

1

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

%Vor%

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;

  • Die Ausgabe von 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 )
  • Wenn Ihr Code mehr als einen Satz Zeilenumbruchzeichen ausgibt, gibt es die Verarbeitung (Zugriff oder Lesen von Daten, auf denen die Ausgabe basiert, auf welche Weise auch immer), um diese anderen Ausgaben zu erzeugen, deren Handhabung durch Ausgabefunktionen usw .
  • Es gibt verschiedene Leistungsindikatoren und daher unterschiedliche Mittel zur Verbesserung der Effizienz auf der Grundlage jedes einzelnen. Zum Beispiel gibt es möglicherweise CPU-Zyklen, Gesamtzeit für die Ausgabe auf der Konsole, Speicherauslastung, etc usw.
  • Die Konsole könnte ein physischer Bildschirm sein, es könnte ein Fenster sein, das von der Anwendung erstellt wurde (z. B. gehostet in X, Windows). Die Leistung hängt von der Wahl der Hardware, der Implementierung der Fenster- / GUI-Subsysteme, des Betriebssystems usw. ab.

Das Obige ist nur eine Auswahl, aber es gibt zahlreiche Faktoren, die bestimmen, was als mehr oder weniger Leistung angesehen werden kann.

    
Peter 20.05.2016, 22:33
quelle
10

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).

    
i486 13.05.2016 19:34
quelle
6

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%     
Richard Hodges 13.05.2016 22:03
quelle
4

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):

%Vor%     
πάντα ῥεῖ 13.05.2016 20:18
quelle
3

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.

    
DOUGLAS O. MOEN 13.05.2016 20:01
quelle
2

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.

    
Mohit Jain 20.05.2016 11:38
quelle

Tags und Links