Autor Beitrag
Mahjong
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 67



BeitragVerfasst: So 15.02.09 16:08 
Hallo,

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

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 67



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 67



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 194
Erhaltene Danke: 14

XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit, Win 10, Win 11
BDS 2006, RAD Studio 2009+C++, Delphi 13, VS 2010 Prof.
BeitragVerfasst: So 15.02.09 19:07 
Hallo,

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

Bis bald Chemiker
DeddyH
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: So 15.02.09 19:12 
Cardinal geht aber auch ;)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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
Einloggen, um Attachments anzusehen!
Mahjong Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 67



BeitragVerfasst: So 15.02.09 20:00 
Vielen Dank,

Der Cardinal/DWord Tipp bringt mich weiter, die Ergebnisse sind besser :).
Chemiker
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 194
Erhaltene Danke: 14

XP, Vista 32 Bit, Vista 64 Bit, Win 7 64 Bit, Win 10, Win 11
BDS 2006, RAD Studio 2009+C++, Delphi 13, VS 2010 Prof.
BeitragVerfasst: 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