.| Autor | Beitrag |
|---|---|
|
000 11.05.2001, 01:43 Prefect |
Ich bin heute über einen Artikel von einem KDE-Entwickler gestolpert. Dieser Artikel behandelt die Geschwindigkeitsprobleme, die bei KDE-Programmen besonders beim Starten auftauchen. KDE-Programme sind komplett in C++ geschrieben, und da liegt wohl zu einem Großteil der Hund begraben.... http://www.suse.de/~bastian/Export/linking.txt (Ich geh mal davon aus, dass ihr jetzt den Artikel gelesen & verstanden habt) Komplett in C++ geschriebene .EXEs leiden natürlich nicht unbedingt so sehr unter dem Problem, da sie meist an eine vor-reloziierte Position, so dass weniger Zeit draufgeht. Sobald DLLs verwendet werden hat man aber ein Problem. Natürlich ist das im weiteren Verlauf des Programms nicht soo kritisch, von daher ist das kein echtes Argument gegen Spiele in C++ (es sei denn es werden ständig DLLs ein/ausgeladen), aber man sollte das doch mal berücksichtigen, wenn's mal wieder um Geschwindigkeit C vs C++ geht... cu,
Widelands - Gemütliche Aufbaustrategie, Free Software |
|
Profil || Suche |
|
001 11.05.2001, 09:48 WareWolf |
Ich kann das nur bestätigen. Schuld ist eigentlich die Eigenart der 80x86 Prozessoren mit getrennten Code und Segmentregistern, was auch im Protected Mode immer noch eine Bremse ist.
Meine Meinung war schon immer: Engines in Assembler pur programmieren. [/wunschdenken] --Sig as a brick ┴┬┴┬┴┬┴┬┴┬┴┬┴ |
|
Profil || Suche |
|
002 11.05.2001, 13:48 Kriz |
Objektiv gesehen ist alles, was nicht direkt Maschinensprache ist, langsam. Subjektiv werden die Grenzen dort gezogen, wo es auf Echtzeitleistung oder akurate Leistung ankommt. Was im Artikel steht, ist richtig. KDE muß erstmal über Xfree und QT sich selber initialisieren, d.h. die komplette GUI plus die unteren Ebenen laden. Das frißt natürlich Zeit. Der Aufruf direkt in KDE erspart natürlich diese Prozedur (persönlich bin ich eher in einer GUI, über die man ein Terminal aufrufen kann als im Terminal selber), logisch. Ab dann werden Zeiteindrücke nur noch rein subjektiver Natur. Wenn ein KDE-Fenster 0.3 Sekunden im Durchschnitt benötigt, um komplett konstruiert, initialisiert und eingabefähig zu sein, dann ist das in meinen Augen völlig korrekt. Langsamere CPU's mit weniger Durchsatz können dann eben nicht so schnell agieren. Zudem müssen Prozeßtabellen usw. aktualisiert werden, was ja auch je nach Systemauslastung mal schneller und mal langsamer vor sich geht. Inwiefern C++ samt Overhead diesen Prozeß noch weiter abbremst, kann nur durch Disassemblierung des Codes festgestellt werden. Wenn die Redundanz schlechter Compiler bei 25% oder mehr liegt, dann kann C++ je nach Projektgröße sicherlich als Bremse dienen. Auf jeden Fall ein interessantes Thema finde ich! Ich glaube, von der reinen Konstruktion eines Fensters ist Windows schneller, da die GUI als Bestandteil des OS agiert und nicht extern geladen werden muß. Wie das dann natürlich bei bereits bestehender KDE-Env aussieht, steht natürlich auf einem anderen Blatt. Viele DLL's (die aber nicht alle beim Start geladen werden, denn dann wäre der Sinn einer DLL für'n Arsch) verzögern dann den Aufbau eines Windows-Fenster und KDE (weiß jetzt nicht, ob es ein DLL Equivalent in KDE gibt) wäre dann schneller... Wie dem auch sei, ob C wirklich schneller ist (infolge fehlender Typprüfungen usw.) als C++, sei mal dahingestellt. Schließlich sind C++ Klassen (über die ja andauernd gewettert werden) Bestandteil von C++ und kein eigens dafür vom Programmierer entwickelter Code wie C-Funktionen. Ich glaube eher, daß eigene C-Funktionen langsamer ausgeführt werden als implementierte Klassen. Auch das würde einer Prüfung bedürfen :) Bin mal gespannt, wie das Thema sich weiterentwickelt... Cu --K:R-I)Z++ |
|
Profil || Suche |
|
003 11.05.2001, 14:58 Buy-Menu-Man |
Hat Geschwindidkeit mit der Programmiersprache zu tun?
Ist es überhaupt möglich einen Compiler zu programmieren, der einen optimalen Maschienencode erzeugt oder ist das nur möglich, wenn man ihn selbst schreibt?
|
|
Profil || Suche |
|
004 11.05.2001, 15:54 Prefect |
@Buy-Menu-Man: Die Geschwindigkeit hat nix mit dem resultierenden Code, sondern mit den Virtual Method Tables zu tun, die bei C++ verwendet werden. Mehr dazu unten. @warewolf: Alle modernen Betriebssysteme (in diesem Fall zählt auch Win9x größtenteils als modernes Betriebssystem) verwenden ein sogenanntes Flat Memory Model in dem Segmentregister keine Rolle mehr spielen. Und jetzt auf zum ausschweifenderen Gesprächspartner ;) Wie in dem Artikel z.T. gezeigt wurde, liegt das Performance-Fressen nicht an den eigentlichen Systemaufrufen wie zum Updaten der Prozesstabellen. Was auf jeden Fall aber stimmt, ist dass X-Windows totaler Mist ist, einfach veraltete Technologie. Die Netzwerktransparenz ist zwar auf dem Papier recht nett, in der Praxis aber einfach ineffizient. Da hat Windows klare Vorteile. Aber ich will hier keine Linux vs. Windows-Diskussion starten, da haben wir auf dem Off-Topic-Board schon das Potential ;)
Ein paar Dinge vorneweg:
So. Jetzt ist die Frage: _Was_ bremst den C++-Code gegenüber C-Code ab?
Der Hammer kommt nämlich eigentlich beim Laden des Programms. Da der Linker beim Linken eines Programmes / DLLs die endgültige Position nicht vorhersagen kann, muß der Code beim Laden eigentlich immer entsprechend angepaßt werden. Hier läßt sich einiges optimieren, so werden die eigentlichen Executables bei Linux z.B. immer auf 0x80000000 geladen, aber eine Restaufgabe bleibt immer noch, besonders bei DLLs.
Jetzt ist es an der Zeit zu untersuchen, wie sich C und C++ hier unterscheiden.
Bei C++-Programmen treten natürlich auch interne Fixups auf, allerdings nur zu nicht-virtuellen Funktionen und globalen Variablen. Virtuelle Methoden sind ja quasi Runtimefixups (indirekte Funktionsaufrufe), und Membervariablen werden ja eh wie Strukturvariablen behandelt.
Ein C-Programm hat also viele interne und wenige externe Fixups. Da interne Fixups schnell sind haben wir hier kein Problem. Ein C++-Programm hat dagegen wenige internet und viel mehr externe Fixups. Und da gerade externe Fixups aufwendig sind verlängert sich die Ladezeit dramatisch. Natürlich sollte man jetzt nicht hier aufhören und sagen: C++ ist scheiße. Denn OOP hat gerade im Bereich von GUIs extreme Boni. Ein paar mögliche Lösungsansätze, die ja eigentlich nicht unbekannt sind: - Dynamic libraries werden in allen Prozessen an die gleiche Stelle im Speicher geladen. Dadurch verringert sich die Anzahl der Relokationen ein bißchen. Dies wird mit dem sogenannten kdeinit-Hack bei KDE teilweise erreicht. Mehr dazu unten.
Der angesprochene kdeinit-Hack basiert darauf, dass bei KDE im Hintergrund immer der kdeinit-Dämon läuft. Wenn jetzt ein neues Programm gestartet werden soll wird ein entsprechendes Signal geschickt. Daraufhjn fork()t sich kdeinit (= dupliziert sich), und lädt in seinen Kindprozess das aufzurufende Programm - interessanterweise als Dynamische Library (!)
Allerdings müssen natürlich die VMTs der abgeleiteten Klassen im Programm selbst immer noch eingerichtet werden. Und das sind recht viele, da jedes eigene Dialogfenster ja z.B. eine eigene Klasse ist. Und so eine Dialogfensterklasse hat recht viele virtuelle Methoden.... Wow, schon mein zweiter Bandwurmthread heute. Ich installier jetzt mal isdn4linux auf meinem LFS-System, ihr habt also wahrscheinlich erstmal Ruhe *g* cu,
Widelands - Gemütliche Aufbaustrategie, Free Software |
|
Profil || Suche |
|
005 11.05.2001, 18:40 TheTinySteini |
Hui, echt ein umfangreicher Thread und ein umfangreiches Thema.
TheTinySteini |
|
Profil || Suche |
|
006 12.05.2001, 01:20 Prefect |
Hmm... hier liegt ein bißchen Konfusion vor. Der Window Manager ist eigentlich nur so ein doofes Programm, dass den Rahmen um ein Fenster zeichnet. Auch wenn man's vielleicht nicht glaubt.
Was den direkten Zugriff angeht: Im Prinzip ist es bei modernen Grakas möglich, sehr große Funktionsbereiche den Anwendungsprogrammen direkt zur Verfügung zu stellen, allerdings wird eben auf das bei X nicht viel Wert gelegt (seit 4.x hat sich da ein bißchen was getan, wie das jetzt so genau intern abläuft bin ich mir im Moment nicht sicher, aber es ist bestimmt noch Raum zu Verbesserungen). Andererseits hat das eigentlich nicht viel mit dem Thread zu tun (auch wenn's ein interessantes Thema ist), da XFree selbst rein in C programmiert ist. Nur eben das Qt-Toolkit, das darauf aufbaut, ist dann vollkommener C++-Code. Übrigens das Beste was es so an C++ gibt. Die Technologien mit Slots und Events sind echt genial. Allerdings braucht man auch einen zusätzlichen Precompiler... :) cu,
Widelands - Gemütliche Aufbaustrategie, Free Software |
|
Profil || Suche |
|
007 12.05.2001, 12:29 TheTinySteini |
Ich hab mir das noch so ein bisschen durch den Kopf gehen lassen - und irgendwie sehe ich keinen vernünftigen Workaround. Man kann natürlich den Code optimieren (wie ja in der linking.txt beim Vergleich Gnome <-> KDE beschrieben) und somit überflüssige externe Fixups einschränken, aber viel mehr ist da nicht. Interne Fixups könnte man ja sogar mit nem neuen kleinen Prozessorregister (Register? Bin mir nicht ganz sicher, ob ich tatsächlich nen Register meine, halt ne 32 Bit Speicherstelle) namens CSO (Codesegment offset) oder so einrichten, in das der Runtimelinker nur noch den Programmcode Offset schiebt und das dann bei jedem Referenzieren einer globalen Var hinzugezählt wird... Aber da ist der Aufwand sehr viel größer als der Nutzen...
TheTinySteini |
|
Profil || Suche |

