Probleme mit Stoppuhr (PerformanceCounter)

Hallo,

ich habe mir in C++ eine primitive Stoppuhr programmiert. Zur Zeitmessung habe ich
die Befehle QueryPerformanceCounter und QueryPerformanceFrequency verwendet (ganzer Code unten abgedruckt)

Nun gibt es aber ein wesentliches Problem. Entgegen vieler Meinungen, dass damit eine exakte und hochauflösende Zeitmessung möglich ist, erhalte ich zwar eine hochauflösende Zeitmessung aber genau ist sie nicht.
Starte ich das Programm auf zwei unterschiedlichen Rechnern (AthlonXP % PIV) möglichst zeitgleich (ich möchte mich hier auf die Sekunden beschränken :smile:), so habe ich innerhalb von ca. 30 Minuten schon einen Unterschied von ca. 8 Sekunden!!! Das entspricht einem Unterschied von 4ms in einer Sekunde. Wie kann das sein?

Zur weiteren Prüfung meines Programms habe ich andere Stoppuhr – Programme auf beiden Rechnern parallel laufen lassen. Das Ergebnis sind (außer bei einem) wieder unterschiedliche Zeiten.

Stoppuhr-Programme:
PCStopp : unterschiedliche Zeiten auf beiden Rechnern
StoppUhrPro V4.1.0 : unterschiedliche Zeiten auf beiden Rechnern
XNote Stopwatch : gleiche Zeiten auf beiden Rechnern
Eigenes Prog. : unterschiedliche Zeiten auf beiden Rechnern

Erstaunlich ist, dass alle Programme, die unterschiedliche Zeiten auf verschieden Rechnern haben, auf einem Rechner gleiche Zeiten besitzen.
Demnach kann doch kein Programmierfehler vorliegen, sondern es muss an dem PerformanceCounter/-freqency liegen.
XNote Stopwatch geht bei der Zeitmessung wahrscheinlich einen anderen (sicheren) Weg.

Hat jemand schon einmal gleiche Erfahrungen gemacht?

Im Voraus herzlichen Dank

Chris

Prog-Code in Cpp:

#include
#include

int main()
{
LARGE_INTEGER iFreq;
LARGE_INTEGER iBegin1, stop1;
double t1=0;

QueryPerformanceFrequency(&iFreq);
printf(„Press Enter“);
getchar();
printf(„Zeitmessung laeuft…\n“);
QueryPerformanceCounter(&iBegin1);

while (t1

Hallo Chris,

was du beschreibst ist ein bekanntest Problem mit PCs, zumindest bei
allen die mit „streaming“ zu tun haben.

Die Counter die du benutzt werden einfach von der CPU Frequenz
abgeleitet. Die CPU hat ein Register in dem jeder Takt gezählt wird
und mit der Angabe (Performance) hast du die Taktfrequenz. Das gibt
in der Tat einen sehr hoch aufgelösten Timer allerdings nur mit der
Genauigkeit des CPU Quarzes. Desweiteren driftet das auch noch mit
der Temperatur, allerdings nicht sehr stark.

Warum und wie Motherboard Hersteller es schaffen Quarze zu verwenden
die bis zu 2% abweichen ist mir ein Rätsel, die Dinger die ich so
kaufe haben 50ppm.

Um genauer messen zu können müßtest du erstmal mit Hilfe der
Echtzeituhr die wirkliche Frequenz der CPU bestimmen und dann
sollte es besser gehen.

Gruß
Stefan

Hallo Stefan,

ich hatte aber gelesen, dass der PerformanceCounter unabhängig vom CPU-Takt arbeitet. Deshalb muss man bei der Zeitberechnung den Takt mittels QueryPerformanceFrequency auslesen. Beim Athlon-Rechner(2,2 Ghz) liegt die Frequenz bei ca. 3,6 Mhz, dagegen beim P4 irgendwo im Ghz-Bereich. Beim Auslesen stellt man fest, dass die Frequenz absolut
konstant ist…zumindest wird sie so angezeigt.

Eigenartige Sache :frowning:

Mit besten Grüßen
Chris

Hallo Chris,

ich hatte aber gelesen, dass der PerformanceCounter unabhängig
vom CPU-Takt arbeitet. Deshalb muss man bei der Zeitberechnung
den Takt mittels QueryPerformanceFrequency auslesen. Beim
Athlon-Rechner(2,2 Ghz) liegt die Frequenz bei ca. 3,6 Mhz,
dagegen beim P4 irgendwo im Ghz-Bereich. Beim Auslesen stellt
man fest, dass die Frequenz absolut
konstant ist…zumindest wird sie so angezeigt.

Eigenartige Sache :frowning:

Du machst da eine gewaltigen Denkfehler !!

Performance ist eine Leistungsmessung, keine Zeitmessung.

Was du jetzt machst, ist aus der Geswchwindigkeit des Autos die Drehzahl des Motors zu berechnen.

Der PerformanceCounter ist dazu gedacht um kurze Zeiten zu messen und Leistungsberechnungen durchzuführen.
Die sind eigentlich gedacht um bei Software festzustellen, welche Funktion wie lange zur Ausführung benötigt … Da alles auf dem selben COmputer gemessen wird, spielen absolute Fehler bei der Zeitmessung keine Rolle.

MfG Peter(TOO)

Hallo Stefan,

Warum und wie Motherboard Hersteller es schaffen Quarze zu
verwenden
die bis zu 2% abweichen ist mir ein Rätsel, die Dinger die ich
so kaufe haben 50ppm.

Verwendest du bei deinen Anwendungen auch Frequencyspreading ??
http://en.wikipedia.org/wiki/Spread_spectrum#Spread-…

MfG Peter(TOO)

Abend Peter,

Verwendest du bei deinen Anwendungen auch Frequencyspreading
??
http://en.wikipedia.org/wiki/Spread_spectrum#Spread-…

Bis jetzt kommen wir ohne diese EMI/EMV Tricks aus, obwohl Gedanken
bei HDTV-SetTopBoxen schon da sind.

Allerdings hat dies nichts mit der Genauigkeit der Quarze zu tun,
selbst ein rumeiern um die Nennfrequenz sollte im Mittel (langzeit)
nicht mehr als 50ppm abweichen.

Gruß
Stefan

Abend Peter!

Die sind eigentlich gedacht um bei Software festzustellen,
welche Funktion wie lange zur Ausführung benötigt … Da
alles auf dem selben COmputer gemessen wird, spielen absolute
Fehler bei der Zeitmessung keine Rolle.

Ich bin entsetzt, es gibt noch jede Menge Anwendungen die hochauflösende
Timer brauchen. Es gibt übrigens auch Anwendungen, die wesentlich
von einer absolut genauen Timer provitieren würden.

Ob so ein streaming Server den Film 1% schneller abspielt ist schon
entscheident.

Gruß
Stefan

Hallo Stefan,

Ich bin entsetzt, es gibt noch jede Menge Anwendungen die
hochauflösende
Timer brauchen. Es gibt übrigens auch Anwendungen, die
wesentlich
von einer absolut genauen Timer provitieren würden.

Grundsätzlich ist Windows nicht für Echtzeitanwendungen geeignet :wink:
(Zumindest wenn die AUflösung im Bereich von Sekunden oder besser sein muss).

MfG Peter(TOO)

Morgen Peter,

Grundsätzlich ist Windows nicht für Echtzeitanwendungen
geeignet :wink:
(Zumindest wenn die AUflösung im Bereich von Sekunden oder
besser sein muss).

Mit was für einem System soll man dann am PC Fernsehen (DVB) schauen
(alle 40ms ein Bild)?

Nu sach nich Linux…

Gruß
Stefan