C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

printf()
Goto page Previous  1, 2, 3, 4
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Bernd Nawothnig
Guest





PostPosted: Tue Apr 24, 2007 1:41 pm    Post subject: Re: printf() Reply with quote



On 2007-04-18, Jirka Klaue wrote:

Quote:
Es gibt jedoch weder für den Compiler zur Übersetzungszeit noch
für die Funktion printf zur Laufzeit die Möglichkeit zu prüfen,
ob tatsächlich die erwarteten Parameter übergeben wurden.

Ich hoffe, Dir ist klar, daß der Compiler selbstverständlich die
Möglichkeit hat, die Typen zu prüfen und das i.A. auch tut.

Ein Compiler muss 'printf("%d", 2.0)' zumindest übersetzen.
Warnungen bezüglich nichtpassender Typen sind mir nur vom gcc
geläufig, und auch da nur für hinreichend konstante Formatstrings.

Das beweist doch schon, daß es dem Compiler nicht
in jedem Fall
unmöglich ist, den Formatstring und die Argumente zu prüfen.

So stimmt es. Im *allgemeinen* Fall kann er es nämlich nicht
überprüfen. Und mehr als eine Überprüfung (es ging ja eigentlich um
Performance im Vergleich zum C++ cout) sehe ich da auch noch nicht.

Inwieweit ein C Compiler da allerdings an printf drehen (und damit
optimieren) kann, bzw. gemäß Standard darf (etwa, indem er in solchen
Spezialfällen ganz was anderes, schnelleres aufruft), ist hier nun
sicherlich gänzlich Off Topic.

Deswegen schlage ich den Umzug in die dafür geeignetere Gruppe vor.




Bernd

--
Religion ist eine Beleidigung der Menschenwürde.
Mit oder ohne sie würden gute Menschen Gutes tun und böse Menschen Böses.
Aber damit gute Menschen Böses tun, dafür bedarf es der Religion.
[Steven Weinberg]
Back to top
Stefan Reuther
Guest





PostPosted: Tue Apr 24, 2007 9:40 pm    Post subject: Re: printf() Reply with quote



Daniels78 wrote:
Quote:
Daniels78 wrote:
Sebastian Bormann wrote:
Kann mir jmd bitte den Unterschied zwischen printf() und cout
erklären.

printf() ist auf jeden Fall die schnellere Möglichkeit.
gruss dan

Zitat meines Profs.:
ich gehe in der Tat davon aus, daß ein einfaches printf schneller als
ein cout ist. Dieses ist zu vermuten, da die Aktivierung des Strom-
objektes ja einen gewissen Wasserkopf mit sich bringen müßte.

Professoren erzählen viel, wenn der Tag lang ist. Insbesondere gibt es
Exemplare, die dieses Jahr das gleiche erzählen, was sie auch letztes
Jahr erzählt haben. Und vorletztes. Und das Jahr davor.

Die "Aktivierung des Stromobjektes" an sich kostet nicht mehr als der
Aufruf von printf. 'std::cout << "Hello, world\n"' ist, in Quasi-C
umgesetzt, 'std::operator<<(std::cout, "Hello, world\n")', also der
Aufruf einer Funktion mit zwei Parametern. 'printf' hingegen wird
letztenendes im Allgemeinen auf 'vfprintf' abgebildet, 'vfprintf(stdout,
args)', ebenfalls eine Funktion mit zwei Parametern.

Falls es um die Kosten für den virtuellen Aufruf geht, die hast du erst
dann, wenn das formatierte Ergebnis an den Streambuffer übergeben wird,
in Form der Funktion 'overflow' oder 'xsputn'. Dort passiert die
Fallunterscheidung, ob in eine Datei oder einen Stringstream ausgegeben
wird (oder in was ganz anderes). An genau der gleichen Stelle hat das
Backend von 'printf' ('_doprnt') aber ebenfalls eine Fallunterscheidung,
ob in ein FILE* oder einen String ausgegeben wird.

Unterschiedliche Kosten fallen nur dadurch an, dass std::ostream den
Formatstring nicht parsen muss, und das ist ein Unterschied zu Ungunsten
von printf.

Ein möglicher Grund für höhere Kosten von iostreams wurde IIRC hier im
Thread noch nicht erwähnt: wenn man die Daten mit
std::cout << "...." << std::endl;
schreibt, wird nach jeder Zeile implizit geflusht.
printf("....\n");
tut das, falls die Ausgabe nicht auf die Konsole geht, nicht. Vergleicht
man diese beiden, wären die iostreams wesentlich langsamer. Im Fall der
Ausgabe in eine Pipe heißt das ja zusätzlich, dass auch der Empfänger-
prozess jede Zeile einzeln bekommt, und somit ebenfalls mehr zu tun hat.
Falls man dieses Flush nicht benötigt, ist 'std::cout << "....\n"'
schneller (und kürzer Smile.


Stefan
Back to top
Nicolas Pavlidis
Guest





PostPosted: Sat Apr 28, 2007 1:22 pm    Post subject: Re: printf() Reply with quote



Stefan Reuther wrote:
Quote:
Daniels78 wrote:
Daniels78 wrote:
Sebastian Bormann wrote:
Kann mir jmd bitte den Unterschied zwischen printf() und cout
erklären.
printf() ist auf jeden Fall die schnellere Möglichkeit.
gruss dan
Zitat meines Profs.:
ich gehe in der Tat davon aus, daß ein einfaches printf schneller als
ein cout ist. Dieses ist zu vermuten, da die Aktivierung des Strom-
objektes ja einen gewissen Wasserkopf mit sich bringen müßte.

Professoren erzählen viel, wenn der Tag lang ist. Insbesondere gibt es
Exemplare, die dieses Jahr das gleiche erzählen, was sie auch letztes
Jahr erzählt haben. Und vorletztes. Und das Jahr davor.


Falls es um die Kosten für den virtuellen Aufruf geht, die hast du erst
dann, wenn das formatierte Ergebnis an den Streambuffer übergeben wird,
in Form der Funktion 'overflow' oder 'xsputn'. Dort passiert die
Fallunterscheidung, ob in eine Datei oder einen Stringstream ausgegeben
wird (oder in was ganz anderes). An genau der gleichen Stelle hat das
Backend von 'printf' ('_doprnt') aber ebenfalls eine Fallunterscheidung,
ob in ein FILE* oder einen String ausgegeben wird.

Naja, an den streambufer geht das ganze ja eigentlich eh immer AFAIK,
der ist ja eigentlich für das schreiben der Daten zuständig, oder
täusche ich mich da?

Quote:
Unterschiedliche Kosten fallen nur dadurch an, dass std::ostream den
Formatstring nicht parsen muss, und das ist ein Unterschied zu Ungunsten
von printf.

Ein möglicher Grund für höhere Kosten von iostreams wurde IIRC hier im
Thread noch nicht erwähnt: wenn man die Daten mit
std::cout << "...." << std::endl;
schreibt, wird nach jeder Zeile implizit geflusht.
printf("....\n");

Naja, cih weiß nicht ob es immer noch ein Problem ist, aber ich musste
einmal beobachten, dass Windows wirklich ein \LF\CR am Ende der Zeile
wollte, was ein bissi unlustig ist, des halb würde ich empfehlen endel
trotzdem zu benutzen, auch wenn man kein flush will. AFAIK flusht cout
ja auch, also um es besser zu unterbidnen sollte man auch auf clog
ausgeben, oder täusch ich mich da.

LG
Nicolas
Back to top
Rolf Magnus
Guest





PostPosted: Sun Apr 29, 2007 4:30 am    Post subject: Re: printf() Reply with quote

Daniels78 wrote:

Quote:
Zitat meines Profs.:
ich gehe in der Tat davon aus, daß ein einfaches printf schneller als
ein cout ist. Dieses ist zu vermuten, da die Aktivierung des Strom-
objektes ja einen gewissen Wasserkopf mit sich bringen müßte.

Was versteht er unter "Aktivierung des Stromobjektes"? Und was für einen
Wasserkopf meint er?

Quote:
Sicher kann man das jedoch nur sagen, wenn sich den vom C++-
Compiler erzeugten Code anschaut.

Nein. Man kann es nur durch Zeitmessungen mit Sicherheit bestimmen, und auch
dann nur für einen Compiler.

Quote:
Natürlich bietet cout sehr viel Möglichkeite als printf, auf die ich,
sofern diese ganz oder teilweise benötigt werden, nicht verzichten
würde. Geht es jedoch nur um ganz einfache formatierte Ausgaben,
so nehme ich meistens auch in einem C++-Programm printf.

Das Mischen von C- und C++-I/O bringt einen weiteren Overhead mit sich, weil
die beiden immer synchronisiert werden müssen.
Back to top
Stefan Reuther
Guest





PostPosted: Sun Apr 29, 2007 2:29 pm    Post subject: Re: printf() Reply with quote

Nicolas Pavlidis wrote:
Quote:
Stefan Reuther wrote:
Ein möglicher Grund für höhere Kosten von iostreams wurde IIRC hier im
Thread noch nicht erwähnt: wenn man die Daten mit
std::cout << "...." << std::endl;
schreibt, wird nach jeder Zeile implizit geflusht.
printf("....\n");

Naja, cih weiß nicht ob es immer noch ein Problem ist, aber ich musste
einmal beobachten, dass Windows wirklich ein \LF\CR am Ende der Zeile
wollte, was ein bissi unlustig ist, des halb würde ich empfehlen endel
trotzdem zu benutzen, auch wenn man kein flush will.

Auch, wenn das oft und gerne geglaubt wird, hat std::endl mit der
Zeilenende-Konvertierung nichts zu tun. Die macht ganz alleine der
streambuf. std::endl ist definiert als "schreibt ein \n und macht dann
ein flush". Vielleicht war das bei hornalten Bibliotheken mal so, in den
letzten 10 Jahren ist mir nichts dergleichen untergekommen.

Quote:
AFAIK flusht cout ja auch,

Das ist in C++, soweit ich das sehe, komplett der Laufzeitbibliothek
überlassen, solange bei einer Leseoperation via cin alle Ausgaben auf
cout "draußen" sind. Das ganze gilt sowieso nur auf interaktiven
Geräten, wobei der Laufzeitbibliothek überlassen ist, zu definieren, was
ein interaktives Gerät ist. Unter Windows (WIMRE sowohl mit Cygwin als
auch mit VC++) wird z.B. ein innerhalb eines Konsolenfensters laufendes
Programm als interaktiv erkannt (und cout ist damit line-buffered),
nicht jedoch eins, das in einem rxvt oder Emacs läuft.

Quote:
also um es besser zu unterbidnen sollte man auch auf clog
ausgeben, oder täusch ich mich da.

clog verhält sich genauso wie cout, allerdings landen die Ausgaben auf
dem stderr-Kanal. Damit ist es kein Ersatz für cout.


Stefan
Back to top
Nicolas Pavlidis
Guest





PostPosted: Sun Apr 29, 2007 10:13 pm    Post subject: Re: printf() Reply with quote

Stefan Reuther wrote:
Quote:
Nicolas Pavlidis wrote:
Stefan Reuther wrote:
Ein möglicher Grund für höhere Kosten von iostreams wurde IIRC hier im
Thread noch nicht erwähnt: wenn man die Daten mit
std::cout << "...." << std::endl;
schreibt, wird nach jeder Zeile implizit geflusht.
printf("....\n");
Naja, cih weiß nicht ob es immer noch ein Problem ist, aber ich musste
einmal beobachten, dass Windows wirklich ein \LF\CR am Ende der Zeile
wollte, was ein bissi unlustig ist, des halb würde ich empfehlen endel
trotzdem zu benutzen, auch wenn man kein flush will.

Auch, wenn das oft und gerne geglaubt wird, hat std::endl mit der
Zeilenende-Konvertierung nichts zu tun. Die macht ganz alleine der
streambuf. std::endl ist definiert als "schreibt ein \n und macht dann
ein flush". Vielleicht war das bei hornalten Bibliotheken mal so, in den
letzten 10 Jahren ist mir nichts dergleichen untergekommen.

Aso. Mir wurde das irgendwaann mal so erklärt, und logisch wärs ja fast Smile.

Quote:
AFAIK flusht cout ja auch,

Das ist in C++, soweit ich das sehe, komplett der Laufzeitbibliothek
überlassen, solange bei einer Leseoperation via cin alle Ausgaben auf
cout "draußen" sind. Das ganze gilt sowieso nur auf interaktiven
Geräten, wobei der Laufzeitbibliothek überlassen ist, zu definieren, was
ein interaktives Gerät ist. Unter Windows (WIMRE sowohl mit Cygwin als
auch mit VC++) wird z.B. ein innerhalb eines Konsolenfensters laufendes
Programm als interaktiv erkannt (und cout ist damit line-buffered),
nicht jedoch eins, das in einem rxvt oder Emacs läuft.

Ok, das wusste ich nicht, danke.

Quote:
also um es besser zu unterbidnen sollte man auch auf clog
ausgeben, oder täusch ich mich da.

clog verhält sich genauso wie cout, allerdings landen die Ausgaben auf
dem stderr-Kanal. Damit ist es kein Ersatz für cout.

Jap, denken vervor schreiben soll helfen. Dann war cerr der der nicht
bufferd einen gibts AFAIK Smile.

Danke && LG
Nicolas
Back to top
James Kanze
Guest





PostPosted: Mon Apr 30, 2007 2:16 am    Post subject: Re: printf() Reply with quote

On Apr 28, 10:22 am, Nicolas Pavlidis <aon.912719...@aon.at> wrote:
Quote:
Stefan Reuther wrote:
Daniels78 wrote:
Daniels78 wrote:
Sebastian Bormann wrote:
Kann mir jmd bitte den Unterschied zwischen printf() und cout
erklären.
printf() ist auf jeden Fall die schnellere Möglichkeit.
gruss dan
Zitat meines Profs.:
ich gehe in der Tat davon aus, daß ein einfaches printf schneller als
ein cout ist. Dieses ist zu vermuten, da die Aktivierung des Strom-
objektes ja einen gewissen Wasserkopf mit sich bringen müßte.

Professoren erzählen viel, wenn der Tag lang ist. Insbesondere gibt es
Exemplare, die dieses Jahr das gleiche erzählen, was sie auch letztes
Jahr erzählt haben. Und vorletztes. Und das Jahr davor.

Falls es um die Kosten für den virtuellen Aufruf geht, die hast du erst
dann, wenn das formatierte Ergebnis an den Streambuffer übergeben wird,
in Form der Funktion 'overflow' oder 'xsputn'. Dort passiert die
Fallunterscheidung, ob in eine Datei oder einen Stringstream ausgegeben
wird (oder in was ganz anderes). An genau der gleichen Stelle hat das
Backend von 'printf' ('_doprnt') aber ebenfalls eine Fallunterscheidung,
ob in ein FILE* oder einen String ausgegeben wird.

Naja, an den streambufer geht das ganze ja eigentlich eh immer AFAIK,
der ist ja eigentlich für das schreiben der Daten zuständig, oder
täusche ich mich da?

Nein. Das ist gerade einer der Vorteile von iostream. Aber
overflow wird nicht unbedingt für jedes Zeichen aufgerufen. Und
streambuf::sputc() ist gewöhnlicherweise inline.

Ich denke, dass von Performance her, kommt es rein auf der
Implementierung. Es gibt schlechte Implementierungen von
iostream, und die sind langsam.

Quote:
Unterschiedliche Kosten fallen nur dadurch an, dass std::ostream den
Formatstring nicht parsen muss, und das ist ein Unterschied zu Ungunsten
von printf.

Ein möglicher Grund für höhere Kosten von iostreams wurde IIRC hier im
Thread noch nicht erwähnt: wenn man die Daten mit
std::cout << "...." << std::endl;
schreibt, wird nach jeder Zeile implizit geflusht.
printf("....\n");

Naja, cih weiß nicht ob es immer noch ein Problem ist, aber ich musste
einmal beobachten, dass Windows wirklich ein \LF\CR am Ende der Zeile
wollte, was ein bissi unlustig ist, des halb würde ich empfehlen endel
trotzdem zu benutzen, auch wenn man kein flush will.

Was hat das damit zu tun? Wenn die Datei in Text-Modus geöffnet
wurde (und cin ist wird in Text-Modus geöffnet), dann wird '\n'
auf die System spezifischen Conventionnen umgemappt. Egal ob man
»<< '\n'«, »<< std::endl« or »putc()« benutzt hat, es
auszugeben.

Quote:
AFAIK flusht cout
ja auch, also um es besser zu unterbidnen sollte man auch auf clog
ausgeben, oder täusch ich mich da.

In der Tat. Clog heiß dasselbe als cerr, nur darf es gepuffert
sein.

--
James Kanze (Gabi Software) email: james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
James Kanze
Guest





PostPosted: Mon Apr 30, 2007 2:21 am    Post subject: Re: printf() Reply with quote

On Apr 29, 11:29 am, Stefan Reuther <stefan.n...@arcor.de> wrote:
Quote:
Nicolas Pavlidis wrote:
Stefan Reuther wrote:
Ein möglicher Grund für höhere Kosten von iostreams wurde IIRC hier im
Thread noch nicht erwähnt: wenn man die Daten mit
std::cout << "...." << std::endl;
schreibt, wird nach jeder Zeile implizit geflusht.
printf("....\n");

Naja, cih weiß nicht ob es immer noch ein Problem ist, aber ich musste
einmal beobachten, dass Windows wirklich ein \LF\CR am Ende der Zeile
wollte, was ein bissi unlustig ist, des halb würde ich empfehlen endel
trotzdem zu benutzen, auch wenn man kein flush will.

Auch, wenn das oft und gerne geglaubt wird, hat std::endl mit der
Zeilenende-Konvertierung nichts zu tun. Die macht ganz alleine der
streambuf. std::endl ist definiert als "schreibt ein \n und macht dann
ein flush". Vielleicht war das bei hornalten Bibliotheken mal so, in den
letzten 10 Jahren ist mir nichts dergleichen untergekommen.

AFAIK flusht cout ja auch,

Das ist in C++, soweit ich das sehe, komplett der Laufzeitbibliothek
überlassen, solange bei einer Leseoperation via cin alle Ausgaben auf
cout "draußen" sind. Das ganze gilt sowieso nur auf interaktiven
Geräten, wobei der Laufzeitbibliothek überlassen ist, zu definieren, was
ein interaktives Gerät ist.

Soweit ich errinnere, spielt die Interaktivität keinen Role
hier. Per Default ist cin mit cout getied; das heißt, dass bei
Eingabe von cin, cout automatisch geflusht wird.

Quote:
Unter Windows (WIMRE sowohl mit Cygwin als
auch mit VC++) wird z.B. ein innerhalb eines Konsolenfensters laufendes
Programm als interaktiv erkannt (und cout ist damit line-buffered),
nicht jedoch eins, das in einem rxvt oder Emacs läuft.

streambuf sind nie »line-buffered«. Der Begriff trifft nur
FILE*.

--
James Kanze (Gabi Software) email: james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Stefan Reuther
Guest





PostPosted: Mon Apr 30, 2007 9:11 am    Post subject: Re: printf() Reply with quote

James Kanze wrote:
Quote:
On Apr 29, 11:29 am, Stefan Reuther <stefan.n...@arcor.de> wrote:
Das ist in C++, soweit ich das sehe, komplett der Laufzeitbibliothek
überlassen, solange bei einer Leseoperation via cin alle Ausgaben auf
cout "draußen" sind. Das ganze gilt sowieso nur auf interaktiven
Geräten, wobei der Laufzeitbibliothek überlassen ist, zu definieren, was
ein interaktives Gerät ist.

Soweit ich errinnere, spielt die Interaktivität keinen Role
hier. Per Default ist cin mit cout getied; das heißt, dass bei
Eingabe von cin, cout automatisch geflusht wird.

Ich bezog mich auf 1.9p11(3):
# The input and output dynamics of interactive devices shall take place
# in such a fashion that prompting messages actually appear prior to a
# program waiting for input. What constitutes an interactive device is
# implementation-defined.
(Minimalanforderungen an konforme Implementation)


Stefan
Back to top
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Goto page Previous  1, 2, 3, 4
Page 4 of 4

 
 


Powered by phpBB © 2001, 2006 phpBB Group