Entwickler-Ecke
Sonstiges (Delphi) - GetTickcount oder Queryperformancecounter wie anwenden?
luckyluc - Sa 10.01.09 15:56
Titel: GetTickcount oder Queryperformancecounter wie anwenden?
Hallo
Also hab jetzt ein programm welches alle primzahlen bis zu einer gewissen zahl ausgibt. Jetzt möchte ich messen, wie lange der computer dafür benötigt hat (also wie lange er braucht um alle primzahlen anzuzeigen).
ich weiß, dass man dafür gettickcounter oder queryperformancecounter benutzen kann.Ich kenne dies jedoch nicht. könnt ihr mir diese erklären und enen tippgeben wie ich das umzusetzeen habe?
Danke!
Delete - Sa 10.01.09 15:59
Zu beiden Funktionen solltest du über die Suche Beispiel hier im Forum finden.
luckyluc - Sa 10.01.09 16:07
also ich finde die bei der suche hier nicht im forum.
Delete - Sa 10.01.09 16:17
GETTICKCOUNT liefert bei mir über acht Seiten Suchergebnisse. Also wenn da nichts dabei ist...
luckyluc - Sa 10.01.09 16:36
ja, gut dankeschön.
schleßlich bis du schon länger als ich im forum :wink: und hast bestimmt raus wie man die besten suchergebnisse bekommst.
Dankeschön! :)
luckyluc - Sa 10.01.09 17:29
Hallo!
kann mir jemand bei meiner bereits oben gestellten frage helfen. denn durch die such- ergebniss erreiche ich keine für mich relevanten beispiele.(zu ungenau, oder nicht im entferntesten mit meinem beispiel zu tun).
Ich hab gar keine ahnung von diesen zwei teilen und benötge daher eine erklärung wie man dies genau anwendet.
Danke!
Marc. - Sa 10.01.09 17:47
GetTickCount:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| var Zeit: Integer; begin Zeit := GetTickCount; Zeit := GetTickCount - Zeit; |
Die Funktion GetTickCount ermittelt die seit dem Systemstart vergangene Zeit in Millisekunden.
QueryPerformanceCounter:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var
t1, t2, freq: Int64; res: Extended; begin QueryPerformanceCounter(t1); QueryPerformanceCounter(t2); QueryPerformanceFrequency(freq); res := ((t2 - t1) / freq) * 1000; |
QueryPerformanceCounter ist etwas genauer
und berücksichtigt zudem den CPU-Takt.
Beide Funktionen finden sich in der Unit
Windows, da sie der WinApi entstammen.
Weitere Informationen finden sich auf der
MS-Page [
http://support.microsoft.com/kb/172338/de]. ;)
Delete - Sa 10.01.09 18:24
Marc. hat folgendes geschrieben: |
QueryPerformanceCounter ist etwas genauer und berücksichtigt zudem den CPU-Takt.
|
Warum liest Du nicht selbst, was in Deinem Link zu finden ist - oder hast Du es nicht verstanden?
QueryPerformanceCounter hat mit dem CPU-Takt NICHTS zu tun!
Marc. - Sa 10.01.09 18:40
hathor hat folgendes geschrieben : |
Warum liest Du nicht selbst, was in Deinem Link zu finden ist - oder hast Du es nicht verstanden? |
Ich hatte das so in Erinnerung. :oops:
Edit: Hab den entsprechenden Teil in meinen Post als ungültig erklärt.
Delete - Sa 10.01.09 19:43
Auch wenn es eigentlich albern ist, habe ich mal eine Klasse zur Kapselung geschrieben. Viel Spaß damit ;)
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48:
| unit WaitCounter;
interface
uses Windows, SysUtils;
type TWaitCounter = class private FStart, FStop, FFrequency: Int64; FWaitTime: Extended; FSuccess: Boolean; public constructor Create; procedure Start; procedure Stop; property WaitTime: Extended read FWaitTime; end;
implementation
constructor TWaitCounter.Create; begin inherited Create; FSuccess := QueryPerformanceFrequency(FFrequency); if not FSuccess then raise Exception.Create(SysErrorMessage(GetLastError)); end;
procedure TWaitCounter.Start; begin if FSuccess and not QueryPerformanceCounter(FStart) then raise Exception.Create(SysErrorMessage(GetLastError)); end;
procedure TWaitCounter.Stop; begin if FSuccess and not QueryPerformanceCounter(FStop) then raise Exception.Create(SysErrorMessage(GetLastError)) else FWaitTime := (FStop - FStart) / FFrequency; end;
end. |
GTA-Place - Sa 10.01.09 19:52
Bau noch eine Delay-Funktion ein, die auf 1/100ms genau funktioniert :lol:
WInfo - Sa 10.01.09 20:02
Moin Moin DeddyH,
könntest noch die Zeit berücksichten zum Aufruf der API Funktion wie
hier [
http://support.microsoft.com/kb/172338/de] beschrieben.
Und nicht das Copyright und die Lizenz vergessen, da die Unit (Klasse) sicher häufig verwendet wird. (ggf. auch Lizenzgebühr und Anmeldung zum Patent, in der USA sicher lukrativ).
Edit: Außerdem wäre es fein, wenn die Klasse beim einbinden automatisch instanziert und im Finalization freigegeben würde.
Delete - Sa 10.01.09 20:06
Ja nee is klar (Knallköppe) :lol:
WInfo - Sa 10.01.09 20:09
Ups, noch was vergessen, eine schöne Testunit wäre auch nicht schlecht, damit man bei Codeänderungen die Klasse schnell und effizient validieren könnt. :angel:
//Edit: Und einen Freiwillgen oder ein Team welches ein Tutorial dazu schreibt, wie man die Klasse am besten im Projekt einsetzt. Findet sich hier einer?
luckyluc - Sa 10.01.09 20:31
Ok, Danke euch für eure vilen Antworten und Hilfen versuche sie entsprechend umzusetzen.
Danke! :)
Delete - Sa 10.01.09 20:58
GTA-Place hat folgendes geschrieben : |
Bau noch eine Delay-Funktion ein, die auf 1/100ms genau funktioniert :lol: |
Wer's braucht: 0.01ms Delay
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| procedure DelayQPC(t: cardinal); var a, b: Int64; Begin QueryPerformanceFrequency(b); QueryPerformanceCounter(a); b := a + (b * t) div 100000; While a < b do QueryPerformanceCounter(a); end;
DelayQPC(1); |
GTA-Place - Sa 10.01.09 21:09
Die ist aber sehr ungenau. Du solltest auf jedenfall den API-Aufruf abziehen, dann wirds besser :-P Laufzeit: 0.01257...ms
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!