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

Suche in: Delphi-Forum, Delphi-Library 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;
  // Routine
  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);
    // Routine
    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

user profile iconMarc. 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

user profile iconhathor hat folgendes geschrieben Zum zitierten Posting springen:
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

{ TWaitCounter }

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

user profile iconGTA-Place hat folgendes geschrieben Zum zitierten Posting springen:
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;   // 100000 = 0.01ms
    While a < b do QueryPerformanceCounter(a);
end;

//Aufruf:
  DelayQPC(1); //1 = 0.01ms, 10 = 0.1ms


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