Zweimal GetTickCount() aufgerufen, rückgabe werte gleich -> wieso?
-
Hi leute,
description im titel. code:
#include <stdio.h> #include <stdlib.h> #include <windows.h> int ending() { printf("end!\n"); return 1; } int main(int argc, char **argv) { long start, end; int i, tmp; start = GetTickCount(); end = tmp = 10; for(i=0; i<10000; i++) { tmp += i*(end ^ 0x3 + i^'b'); } ending(); end = GetTickCount(); printf("distance: %d->%d / tmp: %d\n", start, end, tmp); system("pause"); return 0; }die for schleife und function call sollte nur als kungfoo dienen. ich dachte vielleicht wird zuwenig gemacht.
ausgabe:
end! distance: 20881125->20881125 / tmp: -1581545782 Drücken Sie eine beliebige Taste . . .danke, master clock
-
GetTickCount hat i.d.R. eine Auflösung von 12-15 ms...
-
Ah. Danke. D.h. mit RDTSC bin ich besser bedient, à la:
#include <stdio.h> #include <stdlib.h> #include <windows.h> int ending() { printf("end!\n"); return 1; } unsigned int gettime() { __asm rdtsc; } int main(int argc, char **argv) { unsigned int start, end; int i, tmp; start = gettime(); end = tmp = 10; for(i=0; i<10000; i++) { tmp += i*(end ^ 0x3 + i^'b'); } ending(); end = gettime(); printf("distance: start:%d end:%d =%d\n", start, end, end-start); system("pause"); return 0; }ausgabe:
end! distance: start:383015557 end:383395825 =380268 Drücken Sie eine beliebige Taste . . .Scheint zu funktionieren, oder hab ich einen fehler gemacht?
gruss master clock
-
Nimm lieber:
QueryPerformanceCounter/Frequency
-
Danke, aber wieso?
Gruss, Master Clock
-
"Platformunabhängig" und Du hast eine "Referenzfrequenz"... bei "rdtsc" hast Du nur einen "Wert" mit dem Du i.d.R. nicht viel anfangen kannst...
-
Ok, ist ein gutes Argument. Vielen Dank
-
Ausserdem driften die Clocks verschiedener Cores/CPUs gerne mal. Nicht alle Systeme sind betroffen, und bei einigen wurde es nachträglich irgendwie (Microcode-Update, Treiber, ...) gepatcht so dass die Clocks wieder "gleich" laufen, aber man kann sich eben nicht darauf verlassen.
Mit anderen Worten: wenn du 2x RDTSC aufrufst kann es sein dass die 2 Werte nicht viel miteinander zu tun haben. Kann z.B. auch sein dass der 2. Wert kleiner als der erste ist.
-
QueryPerformanceCounter hat aber auch seine Probleme:
siehe:
http://www.gamedev.net/reference/programming/features/timing/Bei einem Programm von uns waren das pro Tag manchmal 3 Sekunden Abweichung je nach Rechnertyp auchmal eine Stunde...
-
QPC ist *nicht* dazu geeignet *Uhrzeiten* zu messen, sondern nur um *kurze* Zeitdifferenzen zu messen!