Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi JCLCounter - High Performance Counter (https://www.delphipraxis.net/93991-jclcounter-high-performance-counter.html)

creality 14. Jun 2007 13:03


JCLCounter - High Performance Counter
 
Hallo Forum,

ich verwende seit einiger zeit (6Monate) den JCLCounter aus der JCL Lib. Damit versuche ich genaue Zeitmessungen durchzuführen. Ging immer...bis gestern.

Seit gestern kann ich kein einziges Tool mehr starten ohne das die Exception ausgelöst wird: No high performance counters supported. Das würde bedeuten, das meine CPU sowas nicht unterstützt. Sinnlos...weil es über n halbes Jahr ging.

Weiß jemand woran das liegen könnte?

mfg, Marko

:coder:

Bernhard Geyer 14. Jun 2007 13:06

Re: JCLCounter - High Performance Counter
 
Zitat:

Zitat von creality
Seit gestern kann ich kein einziges Tool mehr starten ohne das die Exception ausgelöst wird: No high performance counters supported. Das würde bedeuten, das meine CPU sowas nicht unterstützt. Sinnlos...weil es über n halbes Jahr ging.

(Vor)Gestern sind doch Windows-Updates eingetrutelt ... :gruebel:

fLaSh11 14. Jun 2007 13:13

Re: JCLCounter - High Performance Counter
 
zu faul um ne zeitmessung selber zu amchen? :-D
Ist doch viel einfacher als irgendeine Kompo zu nutzen...

Delphi-Quellcode:
var
  freq,time1,time2: int64;
begin
  QueryPerformanceFrequency(freq);
  QueryPerformanceCounter(time1);

  //Do Something

  QueryPerformanceCounter(time2);

  ShowMessage(FloatToStr((time2-time1)/freq));
Man sollte die Zeit dann evtl runden, weil ja durch den Gleitkommawert das ergebnis verfälsch wird...

Robert Marquardt 14. Jun 2007 13:23

Re: JCLCounter - High Performance Counter
 
Nuetzt aber wahrscheinlich nichts, wenn QueryPerformanceFrequency 0 zurueckliefert.
Pruef mal nach was diese Funktion zurueckliefert. Wenn wirklich 0 zurueckkommt, dann hat das Windows Update einen Fehler eingeschleppt.

shmia 14. Jun 2007 13:32

Re: JCLCounter - High Performance Counter
 
Zitat:

Zitat von fLaSh11
zu faul um ne zeitmessung selber zu amchen? Ist doch viel einfacher als irgendeine Kompo zu nutzen...

Na ja, die Klassen aus der JCL haben schon ihre Berechtigung.
1. kann der Zeitoverhead für den Funktionsaufruf herausgerechnet werden
2. kann man mehr als nur eine Zeitmessung vornehmen. Ohne Kapselung in eine Klasse verliert man völlig den Überblick.
3. man kann die Zeit anhalten und die abgelaufene Zeit erst viel später anzeigen
4. dein code-Schnippsel prüft den Returnwert von QueryPerformanceFrequency nicht !!

Aber egal, auch TJclCounter benützt QueryPerformanceCounter/Frequency.
Delphi-Quellcode:
  // hier der entscheidende Ausschnitt aus dem Sourcecode
  if not QueryPerformanceFrequency(FFrequency) then
    // 'No high performance counters supported'
    raise EJclCounterError.CreateRes(@RsNoCounter);
Die MSDE sagt:
Zitat:

If the function fails, the return value is zero. To get extended error information, call GetLastError. For example, if the installed hardware does not support a high-resolution performance counter, the function fails.
Also, was sagt GetLastError ?

fLaSh11 14. Jun 2007 13:36

Re: JCLCounter - High Performance Counter
 
Zitat:

Zitat von shmia
2. kann man mehr als nur eine Zeitmessung vornehmen. Ohne Kapselung in eine Klasse verliert man völlig den Überblick.
3. man kann die Zeit anhalten und die abgelaufene Zeit erst viel später anzeigen
4. dein code-Schnippsel prüft den Returnwert von QueryPerformanceFrequency nicht !!

zu 2. und 3. kann man mit dem QueryPerformanceCounter genauso
zu 4. sollte nur ein kurzes unvollständiges Beispiel sein... natüröich kann ich noch dies und das prüfen und verbessern

shmia 14. Jun 2007 14:00

Re: JCLCounter - High Performance Counter
 
Zitat:

Zitat von fLaSh11
Zitat:

Zitat von shmia
2. kann man mehr als nur eine Zeitmessung vornehmen. Ohne Kapselung in eine Klasse verliert man völlig den Überblick.
3. man kann die Zeit anhalten und die abgelaufene Zeit erst viel später anzeigen
4. dein code-Schnippsel prüft den Returnwert von QueryPerformanceFrequency nicht !!

zu 2. und 3. kann man mit dem QueryPerformanceCounter genauso
zu 4. sollte nur ein kurzes unvollständiges Beispiel sein... natüröich kann ich noch dies und das prüfen und verbessern

Du hast den Vorteil von Objektorientierter Programmierung noch nicht vollständig verstanden.
Angenommen, du möchtest 10 verschiedene Zeiten messen. Ohne Kapselung in einer Klasse artet das doch in ein Gemetzel aus.
Delphi-Quellcode:
var
  freq,time1Start,time1Stop,time2Start,time2Stop, time3Start,time3Stop, ...... : int64;
Jetzt könnte man natürlich einen Record für die Start und Stopzeit bauen und ein Array nutzen:
Delphi-Quellcode:
type
   TTimeRec = record
     start, stop : Int64;
   end;
var
   freq : int64;
   zeitliste : array[1..10] of TTimeRec;
Der halbe Weg zur Klasse ist schon getan.
Delphi-Quellcode:
// die objekt-orientierte Variante
// kein "herumgerechne", kein Aufruf von Low-Level-Funktionen
// einfach, sauber & klar
var
   zeitliste : array[1..10] of TJclCounter;
begin
   zeitliste[1].Start;
   ...
   zeitlist[1].Stop;
   ...
   ShowMessageFmt('Zeit 1: %f',[zeitlist[1].ElapsedTime]);

Robert Marquardt 14. Jun 2007 14:02

Re: JCLCounter - High Performance Counter
 
Liste der Anhänge anzeigen (Anzahl: 1)
creality, kannst du mal ein simples Testprogramm ausprobieren und das Ergebnis hier posten?

creality 14. Jun 2007 14:08

Re: JCLCounter - High Performance Counter
 
So ich mal wieder:

QueryPerformanceFrequency liefert komischerweise nicht 0 zurück. Und zu faul bin ich auch nich ne Zeitmessung selber zu schreiben...vielleicht schreib ich ja gleich noch den TCPIP Stack neu wenn ich grad dabei bin :thumb:

Ich hab aber den JCP in vielen meiner Tools verwendet und müsste ihn wieder rausnehmen wenn ich Ursache nicht finde...

Delphi-Quellcode:

procedure TForm1.button_3Click(Sender: TObject);
var
  freq,time1,time2: int64;
  i,a : Integer;
begin
  QueryPerformanceFrequency(freq);
  QueryPerformanceCounter(time1);

  for I := 0 to 10000000 do
      Inc(a);

  QueryPerformanceCounter(time2);
  ShowMessage(FloatToStr((time2-time1)/freq));
end;

"Message = 0,0102"

creality 14. Jun 2007 14:11

Re: JCLCounter - High Performance Counter
 
@ Robert: Getestet

Freq := 0;
if not QueryPerformanceFrequency(Freq) then

wird übersprungen...also keine Ausgabe.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:38 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz