2015-06-21 4 views
6

Ich experimentierte mit C++ und versuchte herauszufinden, wie ich die Zahlen von 0 bis n so schnell wie möglich drucken könnte.Wie kann ich einen Zeilenumbruch drucken, ohne den Puffer zu leeren?

Zuerst habe ich gerade gedruckt alle Zahlen mit einer Schleife:

for (int i = 0; i < n; i++) 
{ 
    std::cout << i << std::endl; 
} 

aber ich denke, das den Puffer nach jeder einzelnen Zahl spült, dass es gibt, und sicher, dass muss einige Zeit dauern, also versuchte ich um zuerst alle Zahlen in den Puffer zu drucken (oder tatsächlich, bis es voll ist, scheint es dann automatisch zu spülen) und dann alles auf einmal zu spülen. es scheint jedoch, dass ein \ n Druck nach Wallungen der Puffer wie die std :: endl so ausgelassen ich es:

for (int i = 0; i < n; i++) 
{ 
    std::cout << i << ' '; 
} 
std::cout << std::endl; 

Dies scheint etwa 10-mal schneller als das erste Beispiel auszuführen. Allerdings möchte ich wissen, wie in dem Puffer alle Werte speichern und es auf einmal nicht bündig als lassen es jedes Mal, spülen Sie es voll ist, so habe ich ein paar Fragen:

  1. Ist es möglich, eine neue Zeile drucken ohne den Puffer zu spülen?
  2. Wie kann ich die Puffergröße ändern, so dass ich alle Werte darin speichern und am Ende leeren kann?
  3. Ist diese Methode der Ausgabe von Text dumm? Wenn ja, warum und was wäre eine bessere Alternative?

EDIT: Es scheint, dass meine Ergebnisse durch ein laggy System (Terminal App von einem Smartphone) ... Mit einem schnelleren System der Ausführungszeiten keinen signifikanten Unterschied zeigen voreingenommen waren.

+0

Versuchen Sie, [unitbuf] (http://en.cppreference.com/w/cpp/io/manip/unitbuf) auf "cout" zu deaktivieren, bevor Sie schreiben. –

+3

Verwenden Sie nicht 'endl', da es zum Spülen usw. führt. Verwenden Sie stattdessen' '\ n'' oder '\ n" '? Oder Sie können in komplizierteren Tricks den Puffermodus von 'std :: cout' auf voll gepuffert setzen. –

+0

'std :: cout << '\ n' 'druckt eine neue Zeile. Spülen Sie nicht manuell, es sei denn, Sie haben einen Grund dazu. – nwp

Antwort

3

TL; DR: Im Allgemeinen mit '\n' statt std::endl ist schneller, da std::endl

Erläuterung: std::endl eine Spülung des Puffers bewirkt, während '\n' nicht. Sie können jedoch möglicherweise keine Beschleunigung feststellen, je nachdem, welche Testmethode Sie anwenden.

Betrachten Sie die folgenden Testdateien:

endl.cpp:

#include <iostream> 

int main() { 
    for (int i = 0 ; i < 1000000 ; i++) { 
     std::cout << i << std::endl; 
    } 
} 

slashn.cpp:

#include <iostream> 

int main() { 
    for (int i = 0 ; i < 1000000 ; i++) { 
     std::cout << i << '\n'; 
    } 
} 

Beide sind g++ auf meinem Linux kompiliert wurde System und unterziehen sich den folgenden Tests:

1. time ./a.out

Für endl.cpp, dauert es 19.415s.
Für slashn.cpp dauert es 19.312s.

2.time ./a.out >/dev/null

Für endl.cpp, dauert es 0.397s
Für slashn.cpp, dauert es 0.153s

3. time ./a.out >temp

Für endl.cpp, dauert es 2.255s
Für slashn.cpp braucht es 0.165s

Fazit:'\n' ist definitiv schneller (sogar praktisch), aber der Unterschied in der Geschwindigkeit kann von anderen Faktoren abhängen. Im Fall eines Terminalfensters scheint der begrenzende Faktor davon abhängig zu sein, wie schnell das Terminal selbst den Text anzeigen kann. Da der Text auf dem Bildschirm angezeigt wird und automatisch gescrollt werden muss, treten bei der Ausführung massive Verlangsamungen auf. Auf der anderen Seite, für normale Dateien (wie das temp Beispiel oben), beeinflusst die Geschwindigkeit, mit der der Puffer geleert wird, es sehr. Im Falle einiger spezieller Dateien (wie /dev/null oben), da die Daten gerade in ein schwarzes Loch versunken sind, scheint die Spülung keine Wirkung zu haben.

Verwandte Themen