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 7 von 9

Variablen reduzieren

Durch die Optimierung der Speicherplatznutzung kann sowohl die Geschwindigkeit als auch die Größe der Binärdatei (inklusive des Sourcecodes) optimiert und reduziert werden.

Manchmal sind Funktionen oder Sub-Routinen so Groß und umfangreich, das unheimlich viele Variablen erzeugt werden die aber teilweise nur Zeitweise eine Verwendung finden.
Hier ließe sich der Speicherverbrauch solcher Variablen reduzieren, indem deren Zeitlicher Kontext mit dem Programmablauf synchronisiert wird.
Oder, anders ausgedrückt: Man kann ein und dieselbe Variable für unterschiedliche Zwecke nutzen, wenn sie Ihre vorherige Aufgabe bereits erledigt hat.

Ein kleines (sinnloses) Programm:

Dim A as Integer
Dim B as Integer
Dim C as Integer
Dim D as Integer
A = 10 + 20
B = A * 3
C = 30 + 40 * A + B
D = A + C
For X as Integer = 1 to D
    D -= X
    If D <= 10 Then Exit For
Next
Print D

Hier sieht man die Erzeugung von 4 Variablen welche zur gesamten Laufzeit verfügbar sind.
Zusätzlich wird im Namespace der For-Schleife eine weitere Variable Erzeugt.

Nachdem Das Programm Initialisiert wurde, wären folglich 4 Variablen erzeugt.
Das Programm beginnt anschließend abzuarbeiten.
Kommt es zur For-Schleife, wird für deren Ausführung die X Variable erzeugt.
Nachdem die Schleife Ihren Ablauf beendet hat und zur Print Anweisung weiter läuft, wird die X Variable wieder zerstört, da sie ja nur im Namespace der For-Variable nötig war.

Anschließend erfolgt das Ausgeben der Variablen D


Hier können wir 2 Variablen und eine Codezeile wegreduzieren. Außerdem die Geschwindigkeit leicht erhöhen, indem das Alloc und Dealloc der X-Variablen im Namespace der For-Schleife entfernt wird.

Dim A as Integer
Dim B as Integer
Dim D as Integer
A = 10 + 20
B = A * 3
B = 30 + 40 * A + B
D = A + B
For A = 1 to D
    D -= A
    If D <= 10 Then Exit For
Next
Print D

Wie schön zu sehen ist, existiert die C Variable nicht länger.
Sie wird nicht zwingend benötigt, da die B-Variable ebenfalls das Ergebnis halten kann. Der Wert, welcher vorher in dieser Variable anzutreffen war, wird später nicht mehr benötigt, und kann daher mit dem neuem Wert überschrieben werden.
Außerdem wird die A Variable für die Schleife verwendet. Sie hat ihren Zweck ebenfalls erfüllt und kann damit auch für andere Zwecke verwendet werden.

Eine weitere kleine Optimierung ist noch hier möglich:

B = 30 + 40 * A + B

Diese Zeile lässt sich quellcodeseitig noch ein wenig zu...

B += 30 + 40 * A

... optimieren.

Dies spart in unserem Fall 2 Byte Sourcecode ein.
Würde die Variable eine explizite Bezeichnung haben...

TRechnungB += 30 + 40 * TRechnungA

... ließe sich hiermit schon ganze 18 Byte einsparen.

Betrachtet man dem Gesamten Quellcode auf diese Weise, wären dies sicher einige KByte an Daten-Reduktion.
Ein Weiterer Vorteil derartiger Reduzierung liegt bei der Compilierungsgeschwindigkeit.
Der Compiler braucht nicht mehr ganz so viel Code verarbeiten und kann damit schneller ausgeführt werden.




Vermeidung von GOTO durch Continue

Manchmal muss man aus einem bestimmtem Codeabschnitt weiter springen als es mit Exit For / Do machbar wäre.

Auszug aus: http://www.freebasic-portal.de/code-beispiele/mathematik/die-roemischen-zahlen-217.html

'...
    For j =  0 To Len(r)-1
        k = 0
        While (r[j] <> u[k]) Or (r[j+1] <> u[k+1])
            k = k + 2
            If k > 10 Then GoTo nx
        Wend
        z = z - c(k/2)
        nx:
    Next j
'...

Hier wird mithilfe von "GoTo" aus der "While" und zu "Next" der For-Schleife gesprungen.


In solchen Fällen lässt sich jedoch das "GoTo" vermeiden, indem ein "Continue" Verwendung findet.

'...
    For j =  0 To Len(r)-1
        k = 0
        While (r[j] <> u[k]) Or (r[j+1] <> u[k+1])
            k = k + 2
            If k > 10 Then continue for
        Wend
        z = z - c(k/2)
    Next j
'...

Durch Verwendung von "Continue For" springt das Programm automatisch zur "For ..." Zeile zurück und beginnt einen neuen Durchlauf (inklusive seiner Exit Prüfung).

Das Programm Jumpt mit "Continue ..." immer zur nächstliegenden angegebenen Schleife.



 

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