Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Zeitmessung mit dem RealTimeCounter (https://www.delphipraxis.net/14706-zeitmessung-mit-dem-realtimecounter.html)

tb99de 14. Jan 2004 11:33


Zeitmessung mit dem RealTimeCounter
 
Hallo,

die Zeitmessung mit dem RealTimeCounter (http://www.delphipraxis.net/internal...ect.php?t=8102) funktioniert leider nicht unter Windows XP und Intel-CPU's mit Hyperthrading Technologie.

Die Funktion QueryPerformancecounter liefert falsche Ergebnisse (je nach CPU-Auslastung).

Kennt jemand eine Lösung ?

tb99de

sakura 14. Jan 2004 11:40

Re: Titel: Zeitmessung mit dem RealTimeCounter
 
Hi,

vorweg: Das Titel: in Deinem Titel ist wohl recht überflüssig. Nimm das doch mal raus ;-)

Anschließend suche hier mal nach Hier im Forum suchenGetThreadTimes

...:cat:...

tb99de 14. Jan 2004 12:01

Re: Titel: Zeitmessung mit dem RealTimeCounter
 
ich habe die Überschrift einfach aus eurer Code-Library kopiert.

Statt auf die Suchfunktion zu Verweisen solltet ihr vieleicht eurer Code-Library überarbeiten.

tb99de

choose 14. Jan 2004 12:26

Re: Titel: Zeitmessung mit dem RealTimeCounter
 
Hallo tb99de,

zunächst einmal ein herzliches Willkommen in der Delphi-PRAXiS!

Zitat:

Zitat von tb99de
ich habe die Überschrift einfach aus eurer Code-Library kopiert.

Wenn Du Tippfehler oder andere Dinge, die Du (oder ein Mod) nachträglich anders haben möchtest, kannst Du das über den Edit-Button im ersten Eintrag machen.

Zitat:

Zitat von tb99de
Statt auf die Suchfunktion zu Verweisen solltet ihr vieleicht eurer Code-Library überarbeiten.

Dafür benötigen wir ersteinmal an "besseres Stück Code".

Falls Du Dich für die Prozessorauslastung interessieren solltest, findest Du im Suchergebnis durch sakuras Link einen Thread, in dem genau dieses Problem erfolgreich gelöst worden ist. Dies jedoch ohne Verwendung der API-Funktion QueryPerformanceCounter, zu der Microsoft im MSDN schreibt
Zitat:

Zitat von MSDN
On a multiprocessor machine, it should not matter which processor is called. However, you can get different results on different processors due to bugs in the BIOS or the HAL

Vielleicht würde es helfen, wenn Du einmal beschreibst, welche Ergebnisse Dich unter welchen Umständen irritieren? Anschließend könnten wir an einer Lösung arbeiten. Sollte letztlich eine gelungende Lösung entstanden sein, könnte sie (vielleicht sogar als Ersatz für den von Dir referenzierten Beitrag) in die Code-Library gepostet werden :)

tb99de 14. Jan 2004 12:40

Re: Zeitmessung mit dem RealTimeCounter
 
Also nochmal Hallo zusammen und danke für den Empfang :wink:

Ich benutze die Funktionen QueryPerformanceFrequency(f) und QueryPerformanceCounter(c1) um eine sehr genaue Zeitmessung durchzuführen.

Start:
QueryPerformanceFrequency(f);
QueryPerformanceCounter(c1);

Stop:
QueryPerformanceCounter(c2);
sek := (c2 - c1) / f;

Läuft auch wunderbar, nur ist die Zeit nicht korrekt wenn man einen Intel Processor mit HT hat.
Das Ergebnis schwankt mit der Prozessorauslastung.
Bsp: Messung über 1s-Timer
im Leerlauf = 0.52 sek. --> falsch
Vollast = 1 sek --> richtig

Habe deshalb euren Code ausprobiert um zu sehen ob dieser funjtioniert. Tut's aber auch nicht Ergebnis = -1;
Selbst wenn ich den Process und den Thread nur auf einem Prozessor lege (SetMask sowiewo) sind die Ergebnisse falsch.

Wäre schön Ihr wüßtet eine Lösung.

tb99de

sakura 14. Jan 2004 13:06

Re: Zeitmessung mit dem RealTimeCounter
 
Ich habe hier auch einen P4-HT, aber ich kann Dein Problem nicht nachvollziehen. Bist Du Dir sicher, daß Du keinen Denkfehler machst? :gruebel:

...:cat:...

choose 14. Jan 2004 13:16

Re: Zeitmessung mit dem RealTimeCounter
 
Mit Bei Google suchenqueryperformancecounter hyper threading konnte ich unter den ersten drei Treffern die Aussage
Zitat:

Zitat von JSI FAQ
Some programs, mostly games, run incorrectly on the subject platforms [WinXP with HT].

This problems occurs if the program uses the QueryPerformanceCounter and QueryPerformanceFrequency functions to generate time code, as the output of these functions may be incorrectly interpreted.

sowie diesen Beitrag
Zitat:

Zitat von Ken Hagan
There's QueryPerformanceCounter, but this may occasionally jump by
several seconds because of workarounds for some chipsets (Q274323). [..]On multi-processor (including hyper-threaded P4) systems, it [the frequency] is the processor clock speed [..].
[..]
In all cases, I suppose the workaround is to use the low resolution
clock to sanity-check the high resolution values.

finden.

Mit Multiprozessorsystemen hatte ich im Zusammenhang mit QueryPerformanceCounter bisher keine Schwierigkeiten. Ein Prozessor mit HT steht mir leider nicht zur Verfügung.

EDIT: Kleine Korrektur im zweiten Zitat

sakura 14. Jan 2004 13:19

Re: Zeitmessung mit dem RealTimeCounter
 
Hm, interessant, aber wer nutzt schon Windows XP :angle: Ist aber gut zu wissen, wie dem auch sei, was hat die Suche und der Test von GetThreadTimes ergeben?

...:cat:...

tb99de 14. Jan 2004 13:36

Re: Zeitmessung mit dem RealTimeCounter
 
GetThreadTimes:
Nicht viel.
Bei einer Thread+User-Time vom 100ms pro Sek. messe ich 0.5s pro Sek.
Bei einer Thread+User-Time vom 0.9-1s pro Sek. (Vollast) messe ich genau 1s pro Sek.

Denkfehler fast ausgeschlossen. Die Software ist schon älter und zigfach eingesetzt.
Habe zwei Rechner:
P2 650MHz - QueryPerformanceFrequency = 3.579.545 (paßt zu eurer Code-Lib.) --> OK
P4 HT 3.02 GHz - QueryPerformanceFrequency = 3.056.560.000 --> f

Übrigens "Some programs, mostly games, run incorrectly on the subject platforms [WinXP with HT]" bezieht sich hauptsächlich auf die Verwendung von 32 Bit Integerwerten mit Vorzeichen. Man muß 64 Bit ohne Vorzeichen benutzen.


Ich hoffe euch fällt noch etwas ein.

tb99de

tb99de 14. Jan 2004 13:39

Re: Zeitmessung mit dem RealTimeCounter
 
Sorry, hatte Probleme die Message zu senden.
Lösche Bitte einer die zwei überflüssigen.

tb99de

Michael Leyhe 14. Jan 2004 15:31

Re: Zeitmessung mit dem RealTimeCounter
 
Ich habe hier einen Zeitmessungscode der die Zeit mit hilfe der Systemzeit bestimmt:

Delphi-Quellcode:
 var :t1 , t2 :real;

t1 := time; /// Startzeit
... /// Die Aufgabe

t2 := time; /// Endzeit

t.text := IntToStr (round((t2 - t1)*24*60*60*100); /// die Zeit wird in sek. ausgegeben
Wenn du die Zeit in Millisekunden haben willst, dann musst du noch durch 1000 Teilen;

tb99de 15. Jan 2004 07:45

Re: Zeitmessung mit dem RealTimeCounter
 
Danke für die Anregung aber sowohl die systemzeit (time) als auch der 1ms genaue GetTimeClick werden nur ca. alle 55ms refrescht.
Ich muss aber genaueste Verzögerungen im ms Bereich erzeugen.
Somit habe ich nur die Möglichkeit über QueryPerformanceFrequency.

Mich macht auch die hohe QueryPerformanceFrequency = 3.056.560.000 bei meinem P4 HT 3.02 GHz stuzig.
Also entweder liegt es an der hohen Taktfrequenz oder an HT.

Über Hilfe wäre ich echt dankbar.
tb99de

negaH 15. Jan 2004 10:18

Re: Zeitmessung mit dem RealTimeCounter
 
Zitat:

Mich macht auch die hohe QueryPerformanceFrequency = 3.056.560.000 bei meinem P4 HT 3.02 GHz stuzig.
Also entweder liegt es an der hohen Taktfrequenz oder an HT.
Wieso? das sind fast genau 3.02 GHz, somit arbeitet auf deinem Prozessor das Windows OS direkt mit dem "Real Time Stamp Counter" = RTSC der CPU. Alle neueren CPU's entahlten einen internen 64 Bit Zaähler der JEDEN Taktzyklus um 1 erhöht wird. Somit muß die CPU Taktfrequenz gleich QueryPerformanceFrequency sein.

Falls das OS in QueryPerformanceCounter KEINEN korrektiven Code enthält dann sind deine gemessenen Werte sogar richtiiger als die von GetTickCount, es sei denn die CPU wird von extern angehalten !

Gruß Hagen

tb99de 15. Jan 2004 11:30

Re: Zeitmessung mit dem RealTimeCounter
 
Das Problem ist ja das QueryPerformanceCounter keinen korrekten Wert enthält.

Ich habe die böse Vermutung, dass QueryPerformanceCounter die Taktzyklen EINER HT-CPU liefert.
Past ja auch ungefähr, mein Ergebniss ist Faltor 1.9 falsch.

Nur der Wert von QueryPerformanceCounter um so richtiger wird, je höher die CPU-Auslastung ist.

Ich müßte evtl. die QueryPerformanceCounter von beiden HT-CPU's lesen können.


tb99de

negaH 15. Jan 2004 12:38

Re: Zeitmessung mit dem RealTimeCounter
 
Wenn zwei CPU's a 3 GHz drinnen sind dann muß QueryPerformanceFrequency(), basierend auf dem RTSC, eben 3GHz zurückgeben. Allerdings muß QueryPerformanceCounter() eben 2 mal 3GHz liefern da ja 2 CPU's getaktet werden.
Zumindestens so könnte ich mir den Faktor 1.9 erklären.

Aber Schwankungen im RTSC dürften nicht auftreten, da selbst wenn die CPU im Halt Modus ist, die Zähler weiterlaufen.

Gruß Hagen

tb99de 15. Jan 2004 15:25

Re: Zeitmessung mit dem RealTimeCounter
 
Übrigens etwas sehr interessantes was scheinbar hierzu gehört.

Die CPU-Taktfrequenzanzeige im MotherboardMonitor 5.3.x schwank ebenso mit unterschiedlicher CPU-Auslastung.
Und das Hardwaretool WCPUID zeigt unterschiedliche SystemClock an. Mal 133 MHz und Faktor 23 oder 255 MHz mit Faktor 12.

Ist das so bei HT-CPU's ?

tb99de

tb99de 22. Jan 2004 08:00

Re: Zeitmessung mit dem RealTimeCounter
 
Hallo,

Problem gelöst. :-D

Die Ursache liegt nicht in der HT-CPU sondern in der SpeedStep-Technologie con Intel.
Das Enregieschema muß auf Dauerbetrieb.
Hatte vorher max. Leistung und dennoch schaltete die CPU die Taktfrequenz je nach AUslastung um.

tb99de


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:04 Uhr.

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