Es bringt den Vorteil, dass man in einer Sprache die OOP von Haus aus unterstützt, eben diese Unterstützung benutzen kann, anstatt diese Unterstützung per Hand simulieren zu müssen. Man braucht sich zum Beispiel nicht zu merken, in welcher "Unterklasse" genau eine "Methode" definiert wurde, weil man in C++ alle Methoden von Unterklassen auf dem Objekt aufrufen kann und nicht den Umweg über die (Unter)Klasse gehen muss.
Unterschied Linux / Windowsprogrammierung in C++?
Ehemalige
![]() Anmeldungsdatum: Beiträge: 4695 Wohnort: Berlin |
|
![]() Anmeldungsdatum: Beiträge: 20 Wohnort: Schwäbisch Hall |
Der einzige "Umweg" ist, dass ich die Strukturen casten muss. Gruß TheImaginator |
Ehemalige
![]() Anmeldungsdatum: Beiträge: 4695 Wohnort: Berlin |
Du kannst natürlich gerne GUI-Code in ASM schreiben wenn Dir bei der Geschwindigkeit, die Du damit erreichst einer abgeht. Mal überspitzt ausgedrückt. Dass das totaler Schwachsinn ist, weil der Mensch der die GUI bedient sowieso um Grössenordnungen langsamer ist, als der ach so langsame GUI-Code in C++, der sich wahrscheinlich besser schreiben, verstehen und warten lässt als Assembler (oder eben auch C) ist ja nicht so wichtig. Übrigens müsstest Du diesen Beweis, dass es wirklich merklich langsamer ist, erst einmal erbringen. Kapselung macht Code nicht automatisch langsam. |
![]() Anmeldungsdatum: Beiträge: 20 Wohnort: Schwäbisch Hall |
// Ungekapselt #include <cstdio> #include <ctime> using namespace std; unsigned int GetVar(); unsigned int i = 0; int main() { while(GetVar() < 400000000) {} printf("%d\n", clock()); return 0; } unsigned int GetVar() { i++; return i; } // Gekapselt #include <cstdio> #include <ctime> using namespace std; class Test { public: Test(unsigned int x); unsigned int GetVar(); private: unsigned int i; }; Test t(0); int main() { while(t.GetVar() < 400000000) {} printf("%d\n", clock()); return 0; } Test::Test(unsigned int x): i(x) {} unsigned int Test::GetVar() { i++; return i; } Ergebnis des ungekapselten Codes auf meinem 1.4 GHz AMD: ~2600 OOH ... OOOOHHH ... ICH KOMME!!! 😉 Gruß TheImaginator PS: Wenn du jetzt noch überladene Operatoren und andere objektorientierte Spielereinen benutzt liegt der Wert bei ungefähr 7300. |
![]() Anmeldungsdatum: Beiträge: 724 Wohnort: Darmstadt |
TheImaginator hat geschrieben:
Wohl kaum. TheImaginator hat geschrieben:
Performance in GUI-Anwendungen? Klar... 🙄 |
![]() Anmeldungsdatum: Beiträge: 20 Wohnort: Schwäbisch Hall |
Ich denke da an nen schnellen Bildbetrachter (also nicht GIMP 😉 ). Gruß TheImaginator |
![]() Anmeldungsdatum: Beiträge: 724 Wohnort: Darmstadt |
TheImaginator hat geschrieben:
500 was? Nuessen? |
Anmeldungsdatum: Beiträge: 2159 |
Dein Test ist ziemlich Praxis untauglich. Üblicherweise ist es so das du in Funktionen etwas mehr machst, Rechenintensive Sachen etc. Zwar mag etwas overhead entstehen. Aber wenn dies in der Praxis nur 10 Aufrufe sind, wirst du nicht viel davon Mercken ob der Aufruf jetzt 10ms oder 12ms gebraucht hat, den das was in der Methode Berechnet wird, braucht sehr viel länger. So das die reine Aufrufzeit wieder richtung 0 tendiert. Auf Kapselung oder das OOP langsamer ist daran sollte man niht all zu viel verdanken verwenden. Viel wichtiger sind andere Dinge. Nämlich das sich leichter in Teams entwickeln lässt. Man keinen Redunten Code besitzt. Man veränderungen oder erweiterungen leichter realisieren kann. Soetwas istwichtiger als die Reine ausführzeit. Wäre die Reine Ausführzeit immer noch das wichtigste, würden wir Heute immer noch in Assembler Programmieren. Und Sachen wie Java, Perl, Python, Ruby, ... würden wohl nie benutzt werden. |
![]() Anmeldungsdatum: Beiträge: 724 Wohnort: Darmstadt |
TheImaginator hat geschrieben:
Ist es die GUI, die die Performance schluckt? Anders gefragt: Womit verbringt eine GUI-Anwendung die meiste Zeit? |
![]() Anmeldungsdatum: Beiträge: 20 Wohnort: Schwäbisch Hall |
@Sid Burn: Und jetzt mal zu Appollon:
Dir ist anscheinend nicht klar was clock() tut ...
Die meiste Zeit wartet eine GUI auf die Eingabe des Benutzers. |
![]() Anmeldungsdatum: Beiträge: 724 Wohnort: Darmstadt |
TheImaginator hat geschrieben:
Guter Mann! Warum also die GUI in C schreiben? BTW: Wieso schreibt jeder meinen Nick falsch? |
![]() Anmeldungsdatum: Beiträge: 724 Wohnort: Darmstadt |
Und mal ganz nebenbei: inwiefern hat clock was mit der Antwortzeit zu tun? |
![]() Anmeldungsdatum: Beiträge: 20 Wohnort: Schwäbisch Hall |
Wie gesagt.
The clock() function returns the processor time since the program started, or -1 if that information is unavailable. To convert the return value to seconds, divide it by CLOCKS_PER_SEC. (Note: if your compiler is POSIX compliant, then CLOCKS_PER_SEC is always defined as 1000000.)
Sry, meinte natürlich "Apollon" |
![]() Anmeldungsdatum: Beiträge: 724 Wohnort: Darmstadt |
TheImaginator hat geschrieben:
Ist Ok. 😉 Du bist nicht auf die Kernfrage eingegangen. Die lautet: Warum GUIs in C schreiben, wenn die Antwortzeit von C-GUIs "exakt gleich" mit den C++-GUIs ist? |
Ehemalige
![]() Anmeldungsdatum: Beiträge: 4695 Wohnort: Berlin |
TheImaginator hat geschrieben:
Was genau sind die Zahlen nochmal? Und ja, ich weiss was clock() macht.
Klar, man kann es auch absichtlich langsamer machen als es sein müsste. Man kann aus t in der Objektvariante auch eine lokale Variable von main() machen, oder so eine einfache Methode in die Klassendefinition schreiben, damit sie inline übersetzt wird, oder man kann beides kombinieren: marc@s8n:~/tmp/kapseln$ ./a # Original ohne Objekt. 1280000 marc@s8n:~/tmp/kapseln$ ./b # Original mit Objekt. 1430000 marc@s8n:~/tmp/kapseln$ ./c # `t` lokal in `main()`. 850000 marc@s8n:~/tmp/kapseln$ ./d # `GetVar()` inline. 840000 marc@s8n:~/tmp/kapseln$ ./e # `c` und `d` kombiniert. 1270000 Wobei die Zeiten von c und d natürlich nichts aussagen. Das liegt einfach an dem Code der im Grunde keine wirkliche Arbeit leistet und das halt vom Compiler bemerkt wird. Gerade bei GUIs sind die Möglichkeiten und Vorteile von Objektorientierung sehr deutlich. Ich will auch keine furchtbar langsamen Programme schreiben, aber Zeit die man für Optimierungen aufwendet, ohne das ein Programm wirklich zu langsam ist, halte ich für verschwendete Zeit. Vor allem wenn man an Stellen optimiert, wie bei der GUI, wo im Grunde schon von vornherein klar ist, dass diese bestimmt nicht den Flaschenhals in der Anwendung darstellen werden. Wenn man leistungsfähige, robuste und wartbare Programme schreiben will, wählt man am Anfang gute Algorithmen und Datenstrukturen aus, implementiert das Programm möglichst sauber und dokumentiert. Wenn es danach zu langsam erscheint, wird erst einmal der Profiler angeworfen um zu schauen an welchen Stellen man den meisten Gewinn herausholen kann. Wenn die heissen Stellen identifiziert sind, kann man unter Umständen auch über andere Algorithmen oder Datenstrukturen nachdenken, oder eben an diesen Stellen Optimierungen am Code vornehmen. Um auf das eigentliche Thema einzugehen: Da besteht bei Linux und Windows kein Unterschied. |