Buchempfehlung
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Mikrocomputertechnik mit Controllern der Atmel AVR-RISC-Familie
Umfassend, aber leicht verständlich führt dieses Buch in die Programmierung von ATMEL AVR Mikrocontrollern ein. [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

Tutorial

Optimierungen

von MitgliedThePuppetMasterSeite 6 von 9

Größenoptimierung

Wie auch bei der Geschwindigkeitsoptimierung gibt es bei der Größenoptimierung einen Haufen Möglichkeiten und Tricks, um die Größe zu reduzieren.



Precompiler vermeiden
Im Gegensatz zur Geschwindigkeit, wobei es nicht auf die Größe ankommt, sollte hier fast gänzlich auf MAKROs verzichtet werden.

Ein MAKRO ersetzt konstante Ausdrücke durch Codeabschnitte noch bevor das Kompilat erzeugt wird.

#MACRO test()
    print "abc"
    print "def"
    print "ghi"
#ENDMACRO

test()
test()
test()
End 0

Solch ein Quellcode wird vom Compiler folgendermaßen umgebaut:

print "abc"
print "def"
print "ghi"
print "abc"
print "def"
print "ghi"
print "abc"
print "def"
print "ghi"
End 0

Diese Variante ist sehr vorteilhaft, bei einer schnellen Ausführung, da der Code keine umständlichen und umfangreichen Ausführungsschritte benötigt.
Jedoch reduziert er keinesfalls die eigentliche Binärcodegröße, wenn das Programm überwiegend mit solchem Prozedere ausgestattet wird.

Eine Alternative zu diesem Vorgehen ist die Verwendung von Funktionen und Sub-Routinen.

Sub test()
    print "abc"
    print "def"
    print "ghi"
End Sub

test()
test()
test()
End 0

Diese Code ähnelt dem Ersten sehr, ändert jedoch die Ausführung des Quellcodes massiv ab.
Anstatt simpel die 9 Print Aufrufe auszuführen, muss hierbei zuerst ein Sub-Header aufgebaut und später wieder abgebaut werden.
Dies kostet zwar Zeit, führt allerdings dazu, das die Code-Größe schrumpft.

Solche Optimierungen sind jedoch mit Vorsicht zu genießen!
Die Optimierung von kleinen Teilen kann auch durchaus dazu führen, das der Code größer als gewünscht wird.
Daher sollten Optimierungen immer wieder auf Byte-Ebene im Binär- oder ASM-Ergebnis verglichen werden.

Jedoch kann man durchaus sagen, das größere MAKRO-Prozederen durchaus zu einer Größenoptimierung führen wird.

Im vorherigem Beispiel erzeugt der Makro-Code ein ASM output (unter Linux) von 108 Instruktionszeilen.
Die Sub Variante hingegen von nur 66 Instruktionszeilen.
Zwar ist die erstere Variante schnelle im Ablauf, jedoch auch größer.

Ein weiterer Punkt ist ebenfalls nicht zu verachten.
Die Funktion "Print" wird statisch in das Kompilat inkludiert. Das bedeutet, dass der Quellcode der Print-Funktion (welche sich in der RT-Lib befindet), vollständig in das eigene Programm übernommen wird.

Dieses "Inkludieren" wird nur einmal vorgenommen! Ähnlich wie der Aufbau eines Makros
Daher führt der Compiler bereits eine einfache Optimierung aus, wenn FB-Interne Kommandos verwendet werden.
Nachteilig (durchaus logisch) ist die Reduzierung der Geschwindigkeit, da das Kompilat eine Sub und keine Linearen Kommandos aufruft.




Sinnhaftigkeit von Schleifen

Eine gute Frage stellt sich, wann es sinnvoll ist, eine Schleife zu verwenden, und dann es sinnvoller ist, die Instruktion einfach Untereinander zu Schreiben.

Angenommen wir haben das obige Beispiel bei der 3x Test() aufgerufen wird.

Wie groß ist der Unterschied zu folgendem Code:

Sub test()
    print "abc"
    print "def"
    print "ghi"
End Sub

For X as UInteger = 1 to 3
    test()
Next
End 0

Der Statische Unterschied lautet:
Ohne For: 66 Instruktionszeilen
Mit For: 77 Instruktionszeilen

Erst ab einer Schleifenwiederholung von 14 Durchläufen, gleichen sich beide ASM Instruktionszeilen mit 77.

Das bedeutet, dass es sinnvoller ist, bei Verwendung mehrmaligem Aufrufens erst ab einer Wiederholrate von 14 auf eine Schleife überzugehen.

Das mag jetzt sehr komisch klingen, und auch merkwürdig aussehen, im Sourcecode. Aber, wenn man auf die Codegröße Reduzieren möchte, sollte man manchmal einfach direktere Wege gehen.
Im übrigen ist die direktere Methode auch schneller, da sie den "Overhead" der For-Schleife (Exit-Prüfung und die Sprungpunkte selbst) nicht benötigt.

Die effektive Reduktion der Binary Dateigröße ist also erst bei größeren Schleifendurchläufen als 14 gegeben.

ABER VORSICHT! Die 14 Beziehen sich hier ausschließlich auf den INHALT der For-Schleife selbst!
Man kann nicht einfach davon ausgehen, dass man eine Reduktion erhält, wenn man etwas in eine For Schleife packt, und dies analog dazu direkt hin schreibt.

Es kommt immer darauf an, was dies für ein Code ist, und was dieser tut.


 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  6  7  8  9  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 03.12.2011 von MitgliedThePuppetMaster angelegt.
  • Die aktuellste Version wurde am 17.05.2012 von Mitgliedtheta gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen