Visual Basic Forum

Visual Basic Forum
für VB6 und VB.NET Programmierer
 
RegistrierenRegistrieren  LoginLogin

Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB6] Tutorials
Autor
Nachricht
ZiG
Überflieger
Überflieger

Anmeldedatum: 16.04.2008
Beiträge: 421

VB Programme optimieren - Teil 1
Verfasst am: 15.06.2009, 12:31

Visual Basic Programme optimieren. Teil 1.

Ich möchte euch hier ein paar Tipps zeigen, wie man sein Visual Basic Programm optimieren kann.
Ich denke jeder hat schon mal bemerkt, das VB schnell an seine Grenzen stößt.
Besonders bei aufwendigeren Berechnungen kann es mit in VB geschriebenen Programmen sehr langwierig werden.

Es ist aber möglich noch einiges an Geschwindigkeit rauszuholen, und ich halte das für ein sehr wichtiges Thema, da VB sowieso viel langsamer als die meisten anderen Sprachen ist.

Als erstes zeige ich euch mal einen code zum testen der Geschwindigkeit.
Dazu brauchen wir mal eine Api:

Code:
Private Declare Function GetTickCount Lib "kernel32" () As Long
Durch diese Api erhalten wir aktuelle Zeit in Millisekunden.
Einsetzen können wir das ganze so:

Code:
Private Declare Function GetTickCount Lib "kernel32" () As Long<br />Private start as long, ende as long<br /><br />Private Sub Command1_Click()<br /><br />start = GetTickCount<br /><br />'Hier kommt euer code rein<br /><br />ende = GetTickCount<br /><br />Label1.Caption = (ende-start) / 1000<br /><br />End Sub
Was passiert hier nun?
Zuerst speichern wir die aktuelle Zeit in der Variable "start" mit:
Code:
start = GetTickCount
Dann kommt euer code, den ihr testen wollt.
Und nachdem dieser ausgeführt wurde, holen wir uns nochmal die Zeit und speichern sie in der Variable "ende".
Code:
ende = GetTickCount
Nun haben wir also die Zeit vom Anfang und Ende des codes den ihr testen wollt.
Jetzt müssen wir nur noch diese zwei subtrahieren, durch 1000 teilen und in einem Label anzeigen lassen.
Code:
Label1.Caption = (ende-start)  1000
Jetzt können wir also mit dem testen anfangen.
Ein gutes Beispiel dazu, ist die "Challenge Nr. 1" in der Sektion "Free coding".

Die Aufgabe lautet:
Code:
Ihr schreibt ein Programm, dass alle ungeraden Zahlen bis 100.000 in einer Listbox ausgibt.
Und die Lösung, die dazu gepostet wurde lautet so:
Code:
Private Sub Form_Load()<br />For i = 1 To 100000<br />    If i Mod 2 <> 0 Then<br />        List1.AddItem (i)<br />    End If<br />Next i<br />End Sub
Und so würde es von den meisten VB Programmieren gelöst werden.
Der code ist vollkommen korrekt, aber wie wir ja wissen, ist VB eine sehr langsame Sprache.

Was genau passiert in diesem code?

Also. Aufgabe war es, alle ungeraden Zahlen zwischen 1 und 100000 in eine Liste eintragen zu lassen. Das ist wie ihr an der Größe des Codes sehen könnt nicht so schwer.
Die „For“ Schleife fängt also mit „1“ an und wird so lange um eins erhöht bis „100000“ erreicht wird.
In der „If“ Abfrage wird überprüft ob die Zahl durch 2 teilbar ist.
Wenn es ungleich „0“ ist, dann ist es teilbar und der code in der „If“ Abfrage wird ausgeführt.
Mit „List1.Additem (i)“ wird die aktuelle Zahl, die durch 2 teilbar ist in eine Liste eingetragen.

Jetzt testet ihr mal, wie schnell der code bei euch abläuft.
Hier nochmal der ganze Code mit dem code zum Zeit stoppen.
Natürlich müsst ihr euch eine Listbox , ein Label und einen Button erstellen.

Code:
Private Declare Function GetTickCount Lib "kernel32" () As Long<br />Private start As Long, ende As Long<br /><br />Private Sub Command1_Click()<br />start = GetTickCount<br />For i = 1 To 100000<br />    If i Mod 2 <> 0 Then<br />        List1.AddItem (i)<br />    End If<br />Next i<br /><br />ende = GetTickCount<br />Label1.Caption = (ende-start)  1000<br /><br />End Sub
Jetzt müsstet ihr ungefähr eine Zeit von 5 Sekunden erreicht haben. Kommt natürlich auf euren Computer an.

Was kann man nun verbessern?
Fangen wir in der ersten Zeile der Schleife an.
Code:
For i = 1 To 100000
Die Schleife erhöht in diesem Fall immer um “1”.
Was ja nicht wirklich sinnvoll, ist, da wir ja wissen, dass wir jede zweite Zahl von „1“ weg brauchen.

Die bessere Variante ist also diese hier:
Code:
For i = 1 To 100000 Step 2
„Step 2“ bewirkt, dass die For Schleife immer um „2“ erhöht.
Wir haben die Berechnung also schon halbiert.
Leider werdet ihr keine Verbesserung bei der Zeit bemerken, da der Eintrag in die Listbox extrem langsam ist. Aber dazu kommen wir später.
Bei größeren Berechnungen kann man aber einen deutlichen Unterschied merken.
Falls ihr genau wissen wollt wie schnell die Überprüfung der Zahlen ist, braucht ihr nur die Zeile wo der Eintrag in die Listbox gemacht wird rausnehmen.
So könnt ihr die einzelnen Verbesserungen die ich euch poste testen, ohne das der code zu sehr von der Listbox ausgebremst wird.

Als nächstes sehen wir uns die Variable „i“ in der Schleife an.
Wie man sieht wurde sie nicht vorher deklariert. Das ist nicht wirklich gut.
Auf diese Art, wird i als Typ „Variant“ behandelt, die aber langsam sind und mehr Speicher verbrauchen.
Besser wäre, wenn man „i“ vorher als „Long“ deklariert.

Also fügt das noch vorher ein:
Code:
Dim i as long
So. Nun die „If“ Abfrage.
Code:
If i Mod 2 <> 0 Then<br /> List1.AddItem (i)<br />End if
Theoretisch bräuchten wir diese Überprüfung gar nicht, da wir ja sowieso immer um 2 erhöhen und dadurch nur ungerade Zahlen bekommen.
Aber zur Sicherheit lassen wir diese Überprüfung drin.

Was wir bei der Listbox verbessern können erkläre ich noch später. Jetzt zeige ich euch was man an dieser Zeile noch verbessern kann.
Wenn ihr eine „If“ Abfrage habt, bei der ihr dann nur eine Zeile ausführen lasst, so wie es bei uns ist, dann ist es besser ihr schreibt alles in eine Zeile, da VB es dann ein klein wenig schneller ausführt.

Hier also die Verbesserung:
Code:
If i Mod 2 <> 0 Then List1.AddItem (i)
“End If” müßt ihr entfernen. So bleibt also nur die eine Zeile übrig.

Das war es auch schon mit den Verbesserungen zum Code.

Listbox
Jetzt erkläre ich euch noch was es mit der Listbox auf sich hat.

Listboxen sollte man nur benutzen wenn man dem Benutzer etwas anzeigen muß.
Zum einfachen zwischenspeichern von Daten ist es sehr ungeeignet, auch wenn es einfach zu handhaben ist.
Für das einfache speichern von Daten wäre ein Array die bessere Wahl.
Mit einem Array wäre die Schleife oben in ein paar Millisekunden fertig.

Aber da wir uns die Zahlen anzeigen möchten, müssen wir eine andere Möglichkeit zum optimieren finden.

Etwas, dass sehr viel ausmacht ist, dass bei jedem Eintrag den wir in die Liste machen danach die Liste aktualisiert wird, was natürlich sehr viel Leistung kostet, da wir 50000 Einträge machen.

Also was kann man da machen?
Wir schreiben einfach vor die Schleife:
Code:
List1.Enabled=false
Und nach die Schleife:
Code:
List1.Enabled=True
So wird die Listbox unsichtbar gemacht und das verhindert das ständige aktualisieren der Liste nach jedem Eintrag.
So müsstet ihr jetzt ungefähr die Hälfte der Zeit vom Anfang erreichen.

Es gibt aber auch eine Bessere Lösung als eine Listbox.
Ein Eintrag in ein Listview ist um einen Tick schneller.
Und der code sieht so aus.
Code:
If i Mod 2 <> 0 Then Listview1.ListItems.Add , , i
Jetzt müsstet ihr ungefähr eine Zeit von 1,5Sekunden erreichen.

Wie ihr seht, kann man auch bei einem so kleinen code einiges Verbessern.
Um es dem Benutzer noch angenehmer zu machen, wäre eine Progressbar und ein DoEvents im Code mit einer Abfrage ob Abgebrochen wurde noch praktisch.

Dadurch wird es zwar wieder langsamer, aber dem Benutzer wird so die Möglichkeit geboten etwas anderes in eurem Programm zu tun, bzw. die Berechnung abzubrechen und durch die optische Darstellung des Fortschrittes in der Progressbar kommt dem Benutzer die Wartezeit nicht so lange vor.

So. Das wars.
Ich hoffe ihr habt was gelernt. Wink

mfg, ZiG
_________________
 
Neues Thema eröffnen   Neue Antwort erstellen    Visual Basic Forum Foren-Übersicht -> [VB6] Tutorials

Tags: programme optimieren, visual basic, basic programme

 
 Verwandte Themen   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Wichtig: [Ebook] jetzt lerne ich Visual Basic 6 2987 02.06.2010, 13:55
Keine neuen Beiträge Wenn .... = ..... dann zeige ein bestimmtes Icon 329 06.11.2009, 08:03
Keine neuen Beiträge Wie kann ich mich bei euch anmelden?? 387 20.05.2002, 01:28
Keine neuen Beiträge Eine kleine Frage an euch.. 373 30.09.2007, 09:57
Keine neuen Beiträge Visual Basic.. Version?? 764 22.01.2007, 18:23
 

AdHafencity
RSSGrillen V
Powered by myfeedr Linktausch



[ Time: 0.2128s ][ Queries: 81 (0.0645s) ][ GZIP on - Debug on ]