Buchempfehlung
Visual Basic 6 Kochbuch
Visual Basic 6 Kochbuch
Viele praktische Tipps zum Programmieren mit Visual Basic 6, die sich oft auch auf FB übertragen lassen. [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

Ausführungsgeschwindigkeit bestimmen

von RedakteurytwinkySeite 1 von 3

Auch beim Programmieren gibt es meist mehrere Wege, die zum Ziel führen.
Aber nicht immer, wenn wir das Ziel erreicht haben, sind wir auch da, wo wir hin wollten.
Es gibt tatsächlich Probleme, die sich nicht durch Nachschlagen in der Befehlsreferenz lösen lassen.
Effektive Programmierung war früher ein extrem wichtiges Thema, damals, als ein Prozessor noch 4,75Mhz hatte und der verfügbare Speicher manchmal nur 640Kb und (machmal viel)weniger betrug(Schlagwort "Mehr als 640Kb braucht kein Mensch", fälschlich oft Bill Gates zugeschoben). Doch auch heute im Zeitalter der GHz-Prozessoren und GB-Ram-Speicherplatz macht es Sinn, darüber nachzudenken. Naja, eine Anleitung, wie die Profiling-Fähigkeiten von FreeBASIC genutzt werden können, wird dies nicht. Aber auf alle Fälle, gibt es einen besseren Weg, als mit dem FB-Timer Ausführungszeiten zu messen. Die sind nämlich nicht unbedingt aussagekräftig genug, weil ein moderner Rechner eben noch anderes macht, als 'nur' Programme auszuführen. Nehmen wir als Beispiel nur mal den Wächter von Antivir: Er läuft (meist) ständig mit und benötigt auch Prozessorzeit. Nunja, er läßt sich (auch auf Dauer) abschalten, aber auf Kosten anderer Vorteile. Und alle 'überflüssigen' Programme auszuschalten, nur um ein Programm zu testen, ist relativ praxisfern. Fangen wir einfach mal ganz langsam an:

Dim As Double StartZeit, EndZeit 'brauchen wir für die Zeitmessung
StartZeit=Timer 'Anfangszeit festhalten
Sleep 1 'soll eine 1 Millisekunde warten
EndZeit=Timer 'Endzeit stoppen, in der Annahme, daß der Aufwand gleich ist und rausfällt^^
Print "Das hat ";
Print Using"#.############" ;EndZeit-Startzeit;
Print " gedauert"

Durch das Print Using(..) sehen wir schon mal eine 'lesbare' Zahl, die jedoch erstmal nichts aussagt. Aber wir wissen ja, daß Sleep in Millisekunden angegeben wird, also multiplizieren wir das Ergebnis mit 1000, um das Ergebnis in Sekunden zu erhalten, die Nachkommastellen geben halt die Bruchteile einer Sekunde an.

Print Using"#######.###" ;(EndZeit-Startzeit)*1000;

Jetzt können wir die 'Zeitmessung' benutzen.
Was messen wir als Erstes? Nehmen wir doch einfach eine ganz simple Wertzuweisung. Als Anwort auf alle Fragen, weisen wir 42 mal der Integervariablen Hal zu:

Dim As Double StartZeit, EndZeit 'brauchen wir für die Zeitmessung
Dim Hal As Integer 'eine Testvariable, Hal würde sich wahrscheinlich beschweren^^
StartZeit=Timer 'Anfangszeit festhalten
Hal=42 'Wertzuweisung an Hal
EndZeit=Timer 'Endzeit stoppen, in der Annahme, daß der Aufwand gleich ist und rausfällt^^
Print "Das hat ";
Print Using"#######.###" ;(EndZeit-Startzeit)*1000;
Print " gedauert"
Sleep

Wow, 1 Millisekunde! Aber mehrere 'Messungen' geben höchst unterschiedliche Werte. Was tun?
MichaelW aus dem englischen Forum hat dazu ein Programm vorgestellt, das nicht die Zeit mißt, sondern die Anzahl der Taktzyklen, die ein Befehl benötigt(oder eine Befehlsfolge). Nein, jetzt folgt keine Abhandlung über Prozessorinterna..
(Obwohl das vielleicht gar nicht so verkehrt wäre.)
Counter.Bas erhöht die Prozess-Priorität des aktuellen Prozesses und setzt sie hinterher wieder auf Normal. Damit klappt die Bestimmung ganz gut. Nochmal: Jetzt wird keine Zeit mehr gemessen, sondern wieviel Takte der Prozessor zur Abarbeitung eines Befehls (etwa) benötigt. Das klingt doch schon mal ganz gut! Wollen wir das mal ausprobieren?

 

Gehe zu Seite Gehe zu Seite  1  2  3  
Zusätzliche Informationen und Funktionen
  • Das Tutorial wurde am 22.08.2007 von Redakteurytwinky angelegt.
  • Die aktuellste Version wurde am 11.06.2012 von Redakteurytwinky gespeichert.
  Bearbeiten Bearbeiten  

  Versionen Versionen