printf() "schneller" als cout<<?
-
MaSTaH schrieb:
Unwichtig! Wenn ich Zeit habe eine Konsolenausgabe zu machen, dann darf es mir um die ms auch nicht ankommen. Ausserdem glaube ich, dass der Performancegewinn nur theoretisch ist.
er ist messbar, also real. theoretisch ist cout schneller, aber praktisch ist printf schneller.
aber nicht viel in beiden richtungen.
wenn man selber scrollt, statt das bs scrollen zu lassen, ist man wesentlich schneller als printf und cout. falls jemand speed will, soll er also bestimmt nicht aufs lustige printf umsteigen, wenn er mit nem cout-replacement wahnsinnige speed riegen würde.
-
net schrieb:
// ausgabe: 00001.23 3.4000000 5.600000e+000 FFFFFFFF printf("%08.2f %.7f %e %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
geht vielleicht, sieht aber schlimm aus mit den ganzen setiosflags() da drin// ausgabe: coredump/schutzverletzung printf("%08.2f %.7f %s %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
geht vielleicht, aber man müßte schon gehirnoperiert sein, cout<<static_cast<char*>(0); zu schreiben.
-
Jojo, die ultrakrasse 3D-Grafik in einer Konsole muss schon performant sein.
0xdeadbeef schrieb:
net schrieb:
// ausgabe: 00001.23 3.4000000 5.600000e+000 FFFFFFFF printf("%08.2f %.7f %e %p\n", 1.2345, 3.4, 5.6, -1);
mach das mal mit cout
#include <iomanip> #include <iostream> int main() { std::cout << std::setw(8) << std::setfill('0') << std::setprecision(2) << std::fixed << 1.2345 << ' ' << std::setprecision(7) << std::fixed << 3.4 << ' ' << std::scientific << 5.6 << ' ' << std::hex << std::showbase << -1 << std::endl; }
Da gefällt mir die cout-Lösung wesentlich besser. printf ist C ohne ++. Fertig. :p
-
volkard schrieb:
// ausgabe: coredump/schutzverletzung printf("%08.2f %.7f %s %p\n", 1.2345, 3.4, 5.6, -1);
printf.c:4: warning: format argument is not a pointer (arg 4)
printf.c:4: warning: format argument is not a pointer (arg 5)
-
Bashar schrieb:
printf.c:4: warning: format argument is not a pointer (arg 4)
printf.c:4: warning: format argument is not a pointer (arg 5)gcc zu nehmen ist gemein.
-
Also ich finde die Ausgeben von großen Strukturen bzw.Klassen sehen mit cout eleganter aus...
//Funktion beinhaltet Referenz auf ein objekt von ostream... ostream & operator << (ostream &o,Kugel &k) { o << "\n Durchmesser :"<< k.kugel; ... } //Hauptfunktion cout <<"_______Kugel-Daten______" cout << kugel;
-
volkard schrieb:
Bashar schrieb:
printf.c:4: warning: format argument is not a pointer (arg 4)
printf.c:4: warning: format argument is not a pointer (arg 5)gcc zu nehmen ist gemein.
Wenn dieses Feature so toll wäre, hätten es sicher schon andere Compiler übernommen. So schwer kann das ja nicht zu implementieren sein. Die Wahrheit ist, dass solche Warnungen kein Mensch braucht, weil dieses "Problem" im echten Leben überhaupt nicht auftritt.
-
Bashar schrieb:
volkard schrieb:
Bashar schrieb:
printf.c:4: warning: format argument is not a pointer (arg 4)
printf.c:4: warning: format argument is not a pointer (arg 5)gcc zu nehmen ist gemein.
[...] Die Wahrheit ist, dass solche Warnungen kein Mensch braucht, weil dieses "Problem" im echten Leben überhaupt nicht auftritt.
wie kommst du denn darauf? Ich freue mich, wenn ich die Problematik schon beim Kompilieren sehe und nicht erst während der Ausführung.
Und solche printf("Hallo %s")-Fehler, sind bei mir an der Tagesordnung
-
0xdeadbeef schrieb:
std::cout << std::setw(8) << std::setfill('0') << std::setprecision(2) << std::fixed << 1.2345 << ' ' << std::setprecision(7) << std::fixed << 3.4 << ' ' << std::scientific << 5.6 << ' ' << std::hex << std::showbase << -1 << std::endl; }
ganz schön lang.
wenn mich einer fragen würde, wie man mit cout '00001.23 3.4000000 5.600000e+000 FFFFFFFF' mit diesen werten ausgibt, würde ich vielleicht sowas vorschlagen:char buff[256]; sprintf (buff, "%08.2f %.7f %e %p", 1.2345, 3.4, 5.6, -1); std::cout << buff << std::endl;
-
...und bei der nächsten Gelegenheit vertippt er sich und wundert sich, dass der Compiler ihn nicht drauf hinweist, dass %d mit nem float völliger Bockmist ist.
-
Bashar schrieb:
Die Wahrheit ist, dass solche Warnungen kein Mensch braucht, weil dieses "Problem" im echten Leben überhaupt nicht auftritt.
stimmt. man braucht gar kein printf, weil man keine formatierte ausgabe in c++ macht. einfach tab-separierte ausgabe und wer die daten hübsch haben mag, lädt sie in excel rein. drei klicks weiter kann er sogar ein tortendiagramm (schauder) haben.
und die ganzen male, daß ich sprintf verwendet habe, kann ich mich auch nicht an nen typfehler erinnern.
-
Vielleicht vertippst du dich ja wirklich nie, aber ich für meinen Teil hab mich, gerade wo d auf meiner Tastatur zwischen s und f liegt, schon öfter mit printf und falschen format-strings rumärgern müssen. Zugegeben, der Fehler ist recht einfach zu debuggen, aber nervig ist es trotzdem.
Im Endeffekt ist es wohl Geschmackssache. Für meinen Geschmack ist das C++-API jedenfalls schöner, weil typsicherer - will sagen, es nimmt mir Arbeit ab. An dieser speziellen Stelle schreib ich damit nicht den performantesten Code aller Zeiten, aber dafür sinkt meine Entwicklungszeit - und das ist im echten Leben ne ganze Menge wert.
-
0xdeadbeef schrieb:
Vielleicht vertippst du dich ja wirklich nie
ich bin grossmeister im vertippem. möglicherweise ist das auch einer der gründe, warum ich c++ so mag.
-
volkard schrieb:
Bashar schrieb:
Die Wahrheit ist, dass solche Warnungen kein Mensch braucht, weil dieses "Problem" im echten Leben überhaupt nicht auftritt.
stimmt. man braucht gar kein printf, weil man keine formatierte ausgabe in c++ macht. einfach tab-separierte ausgabe und wer die daten hübsch haben mag, lädt sie in excel rein. drei klicks weiter kann er sogar ein tortendiagramm (schauder) haben.
Wieso muss man keine formatierte Ausgabe in C++ machen? Dann muss man auch keine formatierte Ausgabe in C machen. Oder in Python oder Basic oder lisp oder sonstwo. Oder war das jetzt ironisch und du hast den Smilie nich benutzt
Habe Bashar schon überhaupt nicht verstanden.
-
0xdeadbeef schrieb:
Mir persönlich ist die Typsicherheit doch noch was wert, deswegen kann ich das C-stdio-System nicht ausstehen.
Das ist ein gutes Argument. Mit C kann man viele schmutzige Sachen machen, die für einige sehr schön sind und für andere der Höhepunkt der Ketzerei. Ja, die typsicherheit von C++ ist viel besser als die von C, mit C++ muss ich immer viel mehr aufpassen, was ich da schreibe und die Entwiklung geht IMHO langsamer als mit C.
0xdeadbeef schrieb:
aber dafür ist der Code nachher sowohl lesbar
Das kann ich nicht zustimmen. Ich finde, dass C echt lesbar ist, C++ ist unlesbar, vor allem, wenn diese ganzen Reihen von iterator:: und tempaltes und den ganzen Kram in <...> und was weiß ich für ein Zeug vorkommen. Wenn ich mir mal so nen C++ Code anschaue, verstehe ich kein Wort, ich weiß nicht, wo du siehst, dass C++ Code lesbar ist. Und das ist der Grund, warum ich aufhegört habe, C++ zu lernen.
Findest du das lesbar?
boost::tokenizer<> tok(argv[1], boost::char_separator<char>(",")); // oder das? if(parse(fcnt.c_str(), *(str_p("-----") >> "Zahl" >> int_p >> ':' >> int_p[push_back_a(v)]) >> "-----", space_p).full)
-
supertux schrieb:
Findest du das lesbar?
Ich zumindest nicht. Dein Code hat aber nix damit zu tun, dass das ein C++ Problem ist. Denn bis auf
boost::tokenizer<> tok(argv[1], boost::char_separator<char>(","));
ist da nicht viel C++ spezifisches drin.
Ausserdem ist die Diskussion über Lesbarkeit zwischen C und C++ 'eh sinnlos, denn nicht die Sprachsyntax entscheidet in erster Linie über Lesbarkeit, sondern der Schreibstil des Programmierers. Im C++ Forum gibts 'ne Menge Code, den ich personlich gruselig finde (aneinandergeklatscht, möglichst alles in einer Zeile, unübersichtliche Klammerung und Einrückung, etc). Über meinen Code konnte ich mich bisher noch nicht beklagen.Und was sagt uns das? Vieles ist einfach Geschmackssache, was dir nicht gefällt, findet ein anderer absolut ok. Aber gerade die Objektorientierung von C++ sorgt für 'ne Menge Lesbarkeit
Ship_accelerate(&shuttle, 10); shuttle.accelerate(10);
Da gefällt mir doch Version 2 klar besser.
Bei einigen Sprachmitteln ist der Vergleich zwischen C und C++ sowieso nicht wirklich möglich. Oder hast du schon mal versucht, Templates mit C nachzubauen. Kann mir nicht vorstellen, dass die ganzen defines gut aussehen.
-
DrGreenthumb schrieb:
Wieso muss man keine formatierte Ausgabe in C++ machen?
weil es excel gibt?
Dann muss man auch keine formatierte Ausgabe in C machen.
stimmt genau.
Oder in Python oder Basic oder lisp oder sonstwo.
stimmt auch wieder.
Oder war das jetzt ironisch und du hast den Smilie nich benutzt
ich meine nie etwas ironisch (außer das hier).
mn braucht heutzutage keine formatierte ausgabe mehr, außer der chef verlangt sie in völliger unkenntnis, wo der bartel den most holt. man braucht damals in c sehr wohl formatierte ausgabe. man lehrt in c-kursen/bücherm/vorlesungen/schulhalbjahren für c die verwendung von printf bis zum umfallen, weil das erstens schon immer so war und zweitens der lehrer dabei viele glückshormone bekommt, weil er mal was echt besser weiß als die schüler (die formatstrings kann er halt schon).
-
DrGreenthumb schrieb:
Wieso muss man keine formatierte Ausgabe in C++ machen?
weil es excel gibt?
Danke. Viele scheinen irgendwie total Praxiasfern zu sein. Es gibt Tools, die Dinge bereits ganz toll können, in die Unmengen an Arbeit geflossen sind. Warum sollte man die nciht nutzen? Warum nochmal versuchen etwas in der Richtung selbst hinzubekommen, vor allem, wenn es mit dem eigentlichen Problem nichts zu tun hat?
-
naja, solche schicken Ascii-Tabellen die man in der Schule macht, braucht man wohl nicht.
Aber hin und wieder muss man einfach Text formatieren. Da beisst die Maus keinen Pfaden ab. Egal ob es Excel gibt oder nicht.