Basic optimieren - Teil 2
mad/os
Im zweiten Teil dieses kleinen Kurses werde ich mich mit den Compiler-Befehlen von PowerBASIC und FirstBasic beschäftigen. Diese Befehle haben keinen direkten Einfluß auf den Inhalt deiner Programme. Sie kontrollieren lediglich das Verhalten des Compilers beim Kompilieren und beeinflussen somit die Dateigröße, die Ausführgeschwindigkeit und den Speicherbedarf der Programme. Es gilt nun, die passenden Befehle für dein Programm auszuwählen und das Listings damit zu beginnen. Das könnte zum Beispiel so aussehen:
$CPU 80286 $FLOAT NPX $LIB ALL OFF $ERROR ALL OFF $STRING 1 $SOUND 1 $COM 0 $EVENT OFF $OPTION AUTODIM OFF, CNTLBREAK OFF CLS: PRINT "Hello world!"
Viele der Compiler-Befehle können genausogut über das Options-Menü eingestellt werden. Die Befehle im Programm werden aber vorrangig behandelt und bieten so die elleganteste Möglichkeit, programmspezifische Anpassungen vorzunehmen. Zur besseren Übersicht habe ich den entsprechenden Menüpunkt zu jedem Befehl jeweils in Klammern angefügt.
1. $CPU (Options, Compiler, Generated code) Mit diesem Befehl kannst du bestimmen, ab welchem Prozessor dein Programm lauffähig sein soll. PowerBASIC 2.1 bietet nur zwei Möglichkeiten, bei denen die Wahl nicht schwer fällt. Ab Version 3.0 kannst du wahlweise auch Code für 386er Prozessoren erzeugen lassen. PowerBASIC übersetzt dann manche Befehle anders, so daß die Programmdatei etwas kleiner und schneller wird. Wähle einfach die höchstmögliche Einstellung, es sei denn, du willst dein Programm auch auf älteren Computern einsetzen.
2. $FLOAT (Options, Compiler, Floating Point) Die Wahl des mathematischen Coprozessors sollte bei jedem Programm gut überlegt werden. EMULATE und NPX sind etwa gleich schnell. Die Einstellung PROCEDURE dagegen verlangsamt dein Programm um 10 Prozent. Normalerweise wirst du nur NPX wählen, weil so die kleinsten Programmdateien erzeugt werden. Nur, wenn dein Programm auch auf Computern ohne Coprozessor laufen soll, wählst du EMULATE. Diese Einstellung erzeugt jedoch eine etwa 10 Kilobyte größere Datei mit ebenso erhöhtem Speicherbedarf.
3. $LIB (Options, Linker) Dies ist wohl eine der wichtigsten Einstellungen. PowerBASIC bietet dir hiermit die Möglichkeit, durch Verzicht auf komplette Befehlssätze die Programmdatei wesentlich zu verkleinern. Du solltest dies nutzen und alle unnötigen Code-Bibliotheken abschalten. Wenn dein Programm zum Beispiel keine Druckfunktionen nutzt, dann schalte diese Befehle mit $LIB LPT OFF aus. Etwas verwirrend ist die Option GRAPH. Wenn du diese Bibliothek abschaltest, sind automatisch alle anderen Grafikbefehle deaktiviert. Willst du nun z.B. VGA-Grafik nutzen, muß auf jeden Fall auch GRAPH aktiv sein. Dein Programm kann durch diese Optionen im günstigsten Fall 10 Kilobyte kleiner werden und evtl. auch etwas schneller.
4. $ERROR (Options, Compiler, Error tests) Während der Programmierung und Testphase sollten alle Fehlertests unbedingt eingeschaltet bleiben! Nur so werden kritische Überlauffehler und ähnliches erkannt und auch gemeldet. Erst beim Kompilieren der endgültigen, fehlerfreien Version deines Programmes sollten alle Fehlertests abgeschaltet sein. Auf diese Weise wird es nicht nur kleiner sondern auch schneller.
5. $STRING (Options, Compiler, Metastatements, Alloc string seg) Die nun folgenden Optionen beeinflussen lediglich den Speicherbedarf deines Programmes, Dateigröße und Geschwindigkeit ändern sich nicht. Mit $STRING legst du fest, wie lang dynamische Zeichenketten (Strings) maximal sein dürfen. Die Voreinstellung erlaubt über 32.000 Zeichen und ist somit etwas übertrieben. Ein Verringern des Wertes ist aber nur dann sinnvoll, wenn dein Programm ausschließlich kurze Zeichenketten verwendet.
6. $STACK (Options, Compiler, Metastatements, Stack size) Der Stack ist ein Speicherbereich, der für Rücksprungadressen und lokale Variablen genutzt wird. Eine Änderung des Wertes ändert nichts an Dateigröße und Geschwindigkeit, sondern lediglich am Speicherbedarf. Es empfiehlt sich, den Wert nicht zu groß einzustellen. Um die optimale Größe herauszufinden, solltest du das Programm probeweise mit dem Stack-Test kompilieren.
7. $SOUND (Options, Compiler, Metastatements, Music buffer) Jedes Programm, das keinerlei PLAY-Befehle enthält, sollte mit $SOUND 1 kompiliert werden. Der Speicherbedarf wird dadurch geringfügig reduziert.
8. $COM (Options, Compiler, Metastatements, COM buffer) Diese Einstellung ist vollkommen irrelevant, solange keine Kommunikationsbefehle verwendet werden. Die Dateigröße und der Speicherbedarf änderten sich bei meinen Tests nicht.
9. $EVENT (keine Entsprechung im Menü) Diese Option kann, wenn sie eingeschaltet ist, dein Programm um zirka 2 Prozent verlangsamen und die Datei geringfügig vergrößern. Bei zeitkritischen Berechnungen sollte $EVENT also ausgeschaltet werden. Du kannst auch einzelne Programmteile in $EVENT OFF und $EVENT ON einklammern. Beachte jedoch, daß dann Ereignisse wie zum Beispiel ON KEY oder ON ERROR nicht mehr ausgelöst werden.
10. $OPTION CNTLBREAK (Options, Compiler, Control-Break testing) Dieser praktische Schalter ändert nichts an Dateigröße, Speicherbedarf oder Geschwindigkeit. Er bewirkt einfach, daß dein Programm nicht mehr mit den Tasten Strg+Untbr abgebrochen werden kann. Und außer bei altertümlichen Tools ist das auch gar nicht nötig.
11. $OPTION GOSUB (Options, Compiler, Gosub preserve if error) Die empfohlene Einstellung OFF verkleinert die Programmdatei ein wenig. Das hat allerdings den Nachteil, daß bei einem auftretenden Fehler der Gosub-Stack zerstört wird. Falls dein Programm eine ON ERROR-Fehlerbehandlung nutzt, solltest du diese Option besser eingeschaltet lassen.
12. $OPTION AUTODIM (Options, Compiler, Array auto-dim) Diese Option läßt drei Einstellungen zu, von denen NONE der Standard ist. Ich empfehle jedoch ARRAY, obwohl die Programmdatei dadurch etwas größer wird. Aber nur so kannst du sicher sein, daß jedes Array in der passenden Größe dimensioniert wird. Bei PowerBASIC 3.x wurde dieser Befehl durch $DIM ersetzt.
13. $DEBUG MAP (Options, Compiler, Map file generation) Es wird eine zusätzliche MAP-Datei erzeugt und außerdem wird die Programmdatei um einiges größer. Standardmäßig ist das abgeschaltet und sollte auch so bleiben.
14. $DEBUG PBDEBUG (Options, Compiler, Attach PBD debug info) PowerBASIC 3.x kann zusätzliche Informationen für den Debugger in die Programmdatei einbinden, die dadurch extrem groß wird. Du solltest diese Option wirklich nur dann verwendet, wenn du auf den externen Debugger angewiesen bist!
15. $OPTIMIZE (Options, Compiler, Optimize) Ab PowerBASIC 3.0 steht dir ein weiterer Schalter zur Verfügung, der direkten Einfluß auf Dateigröße und Geschwindigkeit hat. Diese Option bewirkt aber nur bei sehr wenigen Befehlen eine Veränderung. Auch umfangreiche Programme werden nur wenige Bytes kleiner und nur minimal schneller.
Jetzt wirst du dich vieleicht fragen, ob diese Mühe etwas bringt? Und du hast Recht: Ob eine Programmdatei 20 oder 200 Kilobyte groß ist, interessiert bei heutigen Computern kaum. Und doch ist es interessant zu sehen, daß PowerBASIC aus einem leeren (!) Basic-Listing ein bis zu 60 Kilobyte großes Programm erzeugen kann. (Zum Vergleich: Pascal produziert in diesem Fall 2 Kilobyte große Dateien.) Und bereits durch einfache Optimierungen können manche Basic-Programme auf weniger als 20 Kilobyte reduziert werden.
Der wichtigste Aspekt ist jedoch die Geschwindigkeit. Basic hat zwar den Ruf, sehr lahm zu sein, doch liegt das nicht an der Sprache. Schlecht geschriebene Pascal-Programme können spürbar langsamer sein als ein ordentlich optimiertes PowerBASIC-Programm. Und darum wird dieser Kurs fortgesetzt.