Stefan Heimers Homepage | ||
|
Sprachen »de« en Blog Über mich Fotos Basel Zürich Ferien Skiferien 2008 Glarus 2005 Elektronik UKW Sender Vorverstärker Radios Philette 837A Akkord Pinguin Reparaturen Riemenmasse SVR4004EL PWM-Verstärker IR Verlängerung Telefonmikro VCR N1700 VCR-Pflege Video-Optokoppler Telefongebührenzähler Videoverstärker Nuvistor Software sbt shcms Dieser Server Sunday Webserver KDE Basler Dialekt sp504write Optimierung für Administratoren Defragmentieren Partitionieren Debugcode entfernen für Anwender Windowmanager Programmauswahl Links für Programmierer Compilercache Profiler Beispiel Ganz schlimm! Compileroptionen Zeichenketten Linker »KISS Bedingte Anweisungen Flohmarkt Elektr. Bauteile ICs analog Transistoren LEDs ICs digital Delay Lines PC-Zubehör Humbug Radioerinnerungen Radio Europa Andere Sender Regio FM Radio DRS Radio One (St. Louis bei Basel) Gästechat Benutzerkonto
|
KISS: Keep it simple, stupid!EinleitungEin altes Sprichwort sagt: "In der Kürze liegt die Würze". Das gilt natürlich auch für die Programmierung. Ein kleineres Programm wird sicher schneller geladen, und läuft im allgemeinen auch schneller. Ein vergleichendes BeispielEs ist schon erstaunlich, dass relativ komplizierte Programme wie rasmol oder xfig einiges schneller starten als ein simpler Texteditor wie kedit. Oder sollte ich eher sagen, dass es eine Schande ist? ProblemanalyseSchaut man sich den Quellcode von kedit an, sieht das Programm eigentlich recht schlank aus. Auch die Grösse des Ausführbaren Programmes ist minim:
Tatsächlich hat der Autor von kedit im Vergleich zu jenem von xfig ein winziges Programm geschrieben. Aber weshalb dauert der Start von ersterem trotzdem so lange? Die Erklärung wird recht einfach, wenn wir uns mit ldd die Libraries anzeigen lassen, die mit den beiden Programmen verlinkt sind: für kedit
portablix:/usr/src/current/kdeutils/kedit# ldd /opt/kde2/bin/kedit
kedit.so.0 => /opt/kde2/lib/kedit.so.0 (0x0ffbb000)
libkspell.so.3 => /opt/kde2/lib/libkspell.so.3 (0x0ff78000)
libkfile.so.3 => /opt/kde2/lib/libkfile.so.3 (0x0febb000)
libksycoca.so.3 => /opt/kde2/lib/libksycoca.so.3 (0x0fe01000)
libkio.so.3 => /opt/kde2/lib/libkio.so.3 (0x0fd3d000)
libkdeui.so.3 => /opt/kde2/lib/libkdeui.so.3 (0x0fadb000)
libkdesu.so.1 => /opt/kde2/lib/libkdesu.so.1 (0x0fa99000)
libkdecore.so.3 => /opt/kde2/lib/libkdecore.so.3 (0x0f927000)
libdl.so.2 => /lib/libdl.so.2 (0x0f904000)
libDCOP.so.1 => /opt/kde2/lib/libDCOP.so.1 (0x0f8c3000)
libqt.so.2 => /usr/lib/qt/lib/libqt.so.2 (0x0f2b2000)
libpng.so.2 => /usr/lib/libpng.so.2 (0x0f268000)
libjpeg.so.6 => /usr/lib/libjpeg.so.6 (0x0f1f3000)
libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x0f1c4000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x0f0db000)
libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x0f0b1000)
libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x0f079000)
libutil.so.1 => /lib/libutil.so.1 (0x0f057000)
libz.so.1 => /usr/lib/libz.so.1 (0x0f028000)
libstdc++-libc6.1-2.so.3 => /usr/lib/libstdc++-libc6.1-2.so.3 (0x0efb0000)
libm.so.6 => /lib/libm.so.6 (0x0ef63000)
libc.so.6 => /lib/libc.so.6 (0x0ee4d000)
/lib/ld.so.1 => /lib/ld.so.1 (0x30000000)
Insgesamt 23 Libraries
für xfig
portablix:/usr/src/current/kdeutils/kedit# ldd /usr/X11R6/bin/xfig
libjpeg.so.62 => /usr/lib/libjpeg.so.62 (0x0ff8d000)
libm.so.6 => /lib/libm.so.6 (0x0ff40000)
libXpm.so.4 => /usr/X11R6/lib/libXpm.so.4 (0x0ff11000)
libXi.so.6 => /usr/X11R6/lib/libXi.so.6 (0x0fee8000)
libXaw3d.so.6 => /usr/X11R6/lib/libXaw3d.so.6 (0x0fe62000)
libXmu.so.6 => /usr/X11R6/lib/libXmu.so.6 (0x0fe2d000)
libXt.so.6 => /usr/X11R6/lib/libXt.so.6 (0x0fdaa000)
libSM.so.6 => /usr/X11R6/lib/libSM.so.6 (0x0fd80000)
libICE.so.6 => /usr/X11R6/lib/libICE.so.6 (0x0fd48000)
libXext.so.6 => /usr/X11R6/lib/libXext.so.6 (0x0fd19000)
libX11.so.6 => /usr/X11R6/lib/libX11.so.6 (0x0fc30000)
libc.so.6 => /lib/libc.so.6 (0x0fb1a000)
/lib/ld.so.1 => /lib/ld.so.1 (0x30000000)
Insgesamt 13 Libraries
Offensichtlich dauert das laden der vielen Libraries, die bei KDE Programmen automatisch dazugelinkt werden fast ewig. Zwar verfügt Linux (und einige andere moderne Betriebssysteme) über "Load on Demand" (es werden nur die gerade benötigten Teile eines Programmes geladen), trotzdem geht viel Zeit verloren, weil diese wenigen Bruchstücke von den verschiedensten Orten geladen werden müssen. Dabei entstehen folgende Probleme:
SchlussfolgerungenKleine Programme laufen schneller als grosse. Wenig Sourcecode schreiben heisst nicht unbedingt ein kleines Programm erzeugen. Moderne Toolkits wie Qt mitsamt KDE Libraries verwöhnen den Programmierer und erzeugen ohne sein Wissen riesigen, langsamen Code. KDE/Qt oder GTK/Gnome sind sicher hervorragend geeignet für komplexe Officepakete oder Webbrowser, die wirklich den gesamten Umfang an Funktionalität ausnutzen. Für kleinere Projekte sind sie aber totaler Overkill. (libqt.so.* belegt alleine schon mehrere Megabyte) Update: Qt ab Version 4 tritt dem Problem entgegen, indem das Toolkit in mehrere kleinere Libraries aufgeteilt wurde. Somit ist es nun möglich, mit Qt ein Kommandozeilenprogramm zu schreiben, das nicht auch noch den ganzen X11 Code laden muss. © 2002 - 2008 by Stefan Heimers |
Kürzlich geändert
VCR N1700 (de) 2009-11-18 14:06:37 Über mich (de) 2009-11-18 14:04:15 Radio Europa (de) 2009-08-30 17:43:32 Radioerinnerungen (de) 2009-07-18 12:49:46 Radio DRS (de) 2009-07-15 16:32:10 Radio One (St. Louis bei Basel) (de) 2009-06-15 16:57:31 |