Entwickler-Ecke

Windows API - GetTickCount Problem


Mahjong - So 15.02.09 16:08
Titel: GetTickCount Problem
Hallo,

Ich muss momentan mit GetTickCount arbeiten und damit bestimmen wie lange ein bestimmter Programmabschnitt läuft,
mein Ansatz sieht bis jetzt so aus :


Delphi-Quelltext
1:
2:
3:
4:
5:
time1 := GetTickCount;
Prozedur();
time2 := GetTickCount;

label1.caption := intToStr(time2 - time1);


Seltsamerweiße erhalte ich "0" als Wert. Wenn ich jedoch nach jedem TickCount aufruf die Zeit z.B. per ShowMessage ausgabe funktioniert die Sache. Es scheint als müsste ich die Werte erst irgendwie verarbeiten damit es funtioniert.

Laut der Anleitung an die ich mich halten soll, sollte diese Methode der Zeitmessung genau so funktionieren.

Eingesetzt wird Delphi 2009 auf Vista x64.

Gruß


jaenicke - So 15.02.09 16:14

GetTickCount ist ungenau, alles unter ca. 15-30ms lässt sich damit nicht korrekt messen.

Mach mehrere Durchläufe (100-1000) und teile den Wert dadurch. Und dann gibt es noch QueryPerformanceCounter, das sehr viel genauer ist. Einzelne Werte im < 1 ms Bereich solltest du aber auch damit kaum richtig messen können. Mehrere Durchläufe mit Mittelwert sind da immer am besten.


Mahjong - So 15.02.09 17:32

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
GetTickCount ist ungenau, alles unter ca. 15-30ms lässt sich damit nicht korrekt messen.

Mach mehrere Durchläufe (100-1000) und teile den Wert dadurch. Und dann gibt es noch QueryPerformanceCounter, das sehr viel genauer ist. Einzelne Werte im < 1 ms Bereich solltest du aber auch damit kaum richtig messen können. Mehrere Durchläufe mit Mittelwert sind da immer am besten.


Darauf bin ich auch gekommen, nur leider muss ich es wie oben beschrieben lösen. (Die Mittelwert Sache werde ich jedoch tun). Mein eigentliches Problem besteht jedoch darin das es nicht funktioniert, also auch nicht ungenau.
GetTickCount; gibt mir keine Ergebnisse. Zumindest nicht solange ich dannach kein Showmessage(time1) ausführen, warum auch immer.


jaenicke - So 15.02.09 17:38

Kann es sein, dass danach noch mehr Code folgt, so dass einfach kein Neuzeichnen des Labels erfolgt? Dann müsstest du Application.ProcessMessages oder Label1.Repaint / Label1.Refresh nach der Zuweisung der neuen Caption schreiben. Allerdings kostet das natürlich auch wieder etwas Zeit, in einer Schleife sollte das also ggf. nur alle 100 Durchläufe oder so passieren.

user profile iconMahjong hat folgendes geschrieben Zum zitierten Posting springen:
Darauf bin ich auch gekommen, nur leider muss ich es wie oben beschrieben lösen.
Was spricht gegen QueryPerformanceCounter? :gruebel:


Mahjong - So 15.02.09 18:06

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Kann es sein, dass danach noch mehr Code folgt, so dass einfach kein Neuzeichnen des Labels erfolgt? Dann müsstest du Application.ProcessMessages oder Label1.Repaint / Label1.Refresh nach der Zuweisung der neuen Caption schreiben. Allerdings kostet das natürlich auch wieder etwas Zeit, in einer Schleife sollte das also ggf. nur alle 100 Durchläufe oder so passieren.

user profile iconMahjong hat folgendes geschrieben Zum zitierten Posting springen:
Darauf bin ich auch gekommen, nur leider muss ich es wie oben beschrieben lösen.
Was spricht gegen QueryPerformanceCounter? :gruebel:


Die Meinung der Person deren Kurs ich gezwungen bin zu besuchen :/
(die ProcessMessages muss ich mir ansehen)


Chemiker - So 15.02.09 19:07

Hallo,

Wie ist time1 und time2 deklariert? Es sollte als DWord deklariert sein!

Bis bald Chemiker


Delete - So 15.02.09 19:12

Cardinal geht aber auch ;)


jaenicke - So 15.02.09 19:28

user profile iconChemiker hat folgendes geschrieben Zum zitierten Posting springen:
Wie ist time1 und time2 deklariert? Es sollte als DWord deklariert sein!
Schau dir einmal die Deklaration von DWord an. ;-)
Ein DWord bzw. LongWord wird intern als Cardinal umgesetzt. Das siehst du z.B. auch, wenn du die Maus darüber hälst (Turbo Delphi z.B.):
user defined image


Mahjong - So 15.02.09 20:00

Vielen Dank,

Der Cardinal/DWord Tipp bringt mich weiter, die Ergebnisse sind besser :).


Chemiker - So 15.02.09 20:47

Hallo jaenicke,

ich habe DeddyH nicht widersprochen, aber zur besseren Lesbarkeit sollte man doch als DWord die Variablen deklarieren.
Für Datum/Zeit Variabel benutzt man auch den Type TDateTime und nicht Double.

Bis bald Chemiker