Buchempfehlung
Windows System Programming
Windows System Programming
Das Kompendium liefert viele interessante Informationen zur Windows-Programmierung auf Englisch. [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

Threading-Optimierung

von MitgliedThePuppetMasterSeite 5 von 6

Thread Systeme zu optimieren stellt einen weiteren Kraftakt dar.

Es gibt x Ansatzpunkte um ein Programm soweit zu optimieren, das es auch schneller wird.
Als erstes Beispiel nehmen wir uns die Variabelendimensionierung vor. Wie schon im "Threading" Tutorial erwähnt ist es nicht sonderlich ratsam, sofern es nicht zwingend nötig ist, Variablen innerhalb von Schleifen oder "If" Prüfungen zu dimensionieren, welche mehrmals durchlaufen werden.
Ein Beispiel:

Sub Bla()
For X as UInteger = 1 to 10000
    For Y as UInteger = 1 to 10000
        Print X; " "; Y
    Next
Next
End Sub

Durch den "Scope" der zweiten For-Scheife wird Y initialisiert. und nach dessen Ende wieder "zerstört". Das heißt im Klartext, das bei jedem Durchlauf der X Schleife Y neu erzeugt und am Ende der Y Schleife wieder gelöscht wird.
Das Erzeugen und Löschen dieser Variable benötigt natürlich Zeit, die zu lasten der Ausführungsgeschwindigkeit geht.

Alternativ kann hier folgende Optimierung Verwendung finden:

Sub Bla()
Dim Y as UInteger
For X as UInteger = 1 to 10000
    For Y = 1 to 10000
        Print X; " "; Y
    Next
Next
End Sub

Diese Variante initialisiert Y noch vor dessen Verwendung und entfernt diese wieder aus dem Speicher, sobald die Sub beendet wurde.
Nachteilig ist, das Y dauerhaft im Speicher liegt und dadurch Platz weg nimmt. Vorteil jedoch, das keine Zeit verloren geht bei der Initialisierung und Terminierung.

Wann diese Art der Dimensionierung ratsam ist hängt davon ab, wie groß die zu durchlaufende Schleife ist. Angenommen X würde anstatt 10000 Schleifendurchläufe nur 10 tätigen, wäre es wohl nicht so wichtig, wann und wo Y dimensioniert wird. Bei größeren Schleifen kann dies jedoch zu einer Geschwindigkeitsreduktion führen.

Noch problematischer wird es bei folgendem Quellcode.

Sub Bla()
Dim Y as UInteger
For X as UInteger = 1 to 10000
    If X mod 255 = 0 Then
        For Y = 1 to 10000
            Print X; " "; Y
        Next
    End If
Next
End Sub

Hier wird zuerst geprüft ob ein bestimmter Zustand, nämlich "X mod 255 = 0" besteht, bevor Y ausgeführt wird. Angenommen 255 wäre eine Variable, dann wüssten wir nicht, wann und ob überhaupt die Y Schleife ausgeführt wird.

Wäre es hier nicht Ratsam Y in die Schleife zu Integrieren? Ja und Nein. Ja deshalb, weil es eine Zeitersparnis und Speicherschonung darstellt die Variable nur dann zu initialisieren, wenn diese auch wirklich gebraucht wird. Nein aus dem Grunde, da es gut sein kann, das die Y Schleife alle 10000 Durchläufe von X ausgeführt wird.
Aus diesem Grunde würde ich eher zu letztere Variante tendieren und die Variable dennoch zuerst initialisieren bevor die beiden Schleife Ihre Arbeit aufnehmen.

Anders ist dies bei darauffolgenden "Exit" Konditionen.

Sub Bla()
For X as UInteger = 1 to 10000
    If X mod 255 = 0 Then
        For Y as UInteger = 1 to 10000
            Print X; " "; Y
        Next
        Exit Sub
    End If
Next
End Sub

Da die Sub Routine nach dem Durchlauf der Y Schleife sowieso verlassen wird, kann hier Zeit und Speicher eingespart werden indem die Erzeugung der Y Variable nur dann vorgenommen wird, wenn diese auch wirklich gebraucht wird.
Das beschleunigt vor allem den Aufbau des Stacks und des Prozedur Headers im Speicher, welcher vom Betriebssystem übernommen wird.

Man kann sich hier schon gut vorstellen, welche Komplexität solch kleine Optimierungen auf den gesamten Arbeitsablauf des Programms haben kann, oder eben diesen ausbremst.
Es sollte also gut überlegt werden, wann welche Optimierungsstrukturen Anwendung finden, und wann nicht.

Betrachtet man fremden Quellcode der einem sehr merkwürdig strukturiert erscheint, muss dies nicht immer auf mangelnde Kompetenz oder schlechten Programmierstiel hindeuten.
Ein guter Programmierer nutzt viele Optimierungsstrategien um seinen Quellcode möglichst schnell abarbeiten zu lassen sowie speicherschonend im Computer zu platzieren.

Techniken zur Optimierung müssen ebenfalls nicht zwangsläufig die Geschwindigkeit oder den Speicherverbrauch betreffen. Manchmal ist es einfach übersichtlicher Quellcode anders anzuordnen, um eine bessere Übersicht zu erhalten.

Sub Bla(V_Parameter as String)
If Left(V_Parameter, 10) = "Hallo Wie " Then
    Foo1(V_Parameter, "Wert_12", 123, "abc")
    Exit Sub
End If
If Left(V_Parameter, 3) = "Wie" Then
    Foo1(V_Parameter, "abc", 10, "test")
    Exit Sub
End If
If Left(V_Parameter, 5) = "Hallo" Then
    Foo1(V_Parameter, "d", 123456, "")
    Exit Sub
End If
If Left(V_Parameter, 1) = "." Then
    Foo1(V_Parameter, "Ende", 999, "OK")
    Exit Sub
End If
End Sub

Optisch kann dieser Quellcode durch die Nutzung von "Tabs" und dem Kommandotrenner ":" sauber angeordnet werden. Zusätzlich spart dies Quellcode ein.

Sub Bla(V_Parameter as String)
If Left(V_Parameter, 10)    = "Hallo Wie "  Then Foo1(V_Parameter, "Wert_12",   123,    "abc"  ): Exit Sub
If Left(V_Parameter, 3)     = "Wie"         Then Foo1(V_Parameter, "abc",       10,     "test" ): Exit Sub
If Left(V_Parameter, 5)     = "Hallo"       Then Foo1(V_Parameter, "d",         123456, ""     ): Exit Sub
If Left(V_Parameter, 1)     = "."           Then Foo1(V_Parameter, "Ende",      999,    "OK"   ): Exit Sub
End Sub

Dieser Programmierstiel mag sehr unorthodox erscheinen, ist jedoch sehr hilfreich um die Übersicht, über die in unserem Beispiel verwendeten Abschnitte, der einzelnen Komponenten, beizubehalten.
Die Strukturierung ähnelt hier einer Tabelle welche in jeder Spalte eine bestimmte Thematik behandelt, bzw. einen bestimmten Wert darstellt.
Bei komplexen oder vielseitig verwendeten Funktionen oder Sub Routinen ist solch eine Strategie durchaus empfehlenswert, da sie schon beim überfliegen des Quellcodes leichte gelesen werden kann.

Hier möchte ich jedoch nicht weiter auf Strukturierung von Quellcode eingehen, da es themenfern ist. Die Beispiele sollen nur einen kleinen Überblick liefern wie durch umsichtige Verwendung von Programmiertechniken sowohl die Geschwindigkeit, Speicherverbrauch als auch Übersicht zu wahren ist.


 

Gehe zu Seite Gehe zu Seite  1  2  3  4  5  6  
Zusätzliche Informationen und Funktionen
  Bearbeiten Bearbeiten  

  Versionen Versionen