QueryPerformanceCounter
-
LARGE_INTEGER start_ticks, ende_ticks, frequenz; double tick_diff = 0; start_ticks.QuadPart = 0; ende_ticks.QuadPart = 0; QueryPerformanceCounter(&start_ticks); QueryPerformanceFrequency(&frequenz); // testfunktion QueryPerformanceCounter(&ende_ticks); tick_diff = ((double) ende_ticks.QuadPart - (double) start_ticks.QuadPart) / frequenz.QuadPart;ausgabe von tick_diff:
0.001293 0.001821 0.000715 0.000938 0.000999 0.001253 0.000723 0.001265 0.001106 0.001395wie rechne ich tick_diff in ms um?
-
etwa so:
tick_diff = ((double)ende_ticks.QuadPart - start_ticks.QuadPart)*1000.0/frequenz.QuadPart;(ungetestet)

-
welche aufloesung hat QueryPerformanceCounter, 10ms?
welche aufloesung hat rdtsc?
-
QueryPerfCounter zählt sekunden, die auflösung war, glaube ich, 100nS.
RDTSC gibt die anzahl der prozessortakte wieder, seit dem einschalten der kiste.

-
hansderkanns schrieb:
welche aufloesung hat QueryPerformanceCounter, 10ms?
Die Auflösung ist abhängig von der Frequenz und kann von Prozessor zu Prozessor unterschiedlich sein.
-
lohnt sich das setzen von SetPriorityClass bzw SetThreadPriority vor der messung, damit lass ich windows die messung nicht so viel verpfuschen? gibts sowas unter linux?
SetPriorityClass(GetCurrentProcess, REALTIME_PRIORITY_CLASS); SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_TIME_CRITICAL); // messung ... SetThreadPriority(GetCurrentThread, THREAD_PRIORITY_NORMAL); SetPriorityClass(GetCurrentProcess, NORMAL_PRIORITY_CLASS);
-
hansderkanns schrieb:
lohnt sich das setzen von SetPriorityClass bzw SetThreadPriority vor der messung, damit lass ich windows die messung nicht so viel verpfuschen?
lohnt sich auf jeden fall, die auf volle pulle zu setzen. meistens laufen keine anderen threads mit solch hoher priority. es geht aber nur wenn du admin-rechte hast.
hansderkanns schrieb:
gibts sowas unter linux?
in linux sollte es auch gehen, such mal nach:
setpriority
sched_setscheduler
sched_setparam
pthread_setschedparam
pthread_setschedpolicy
pthread_attr_setschedparam
pthread_attr_setschedpolicy

-
Hi,
ich habe mal das im inet gefunden und benutze es seitdem zur Zeitmessung:class QPerformanceTimer { public: QPerformanceTimer(int& MicroSeconds) : m_Output(MicroSeconds) { ::QueryPerformanceCounter(&m_Start); } ~QPerformanceTimer(void) { if (m_Start.QuadPart == 0) { m_Output = -1; // system doesn't support performance counter return; } LARGE_INTEGER stop; LARGE_INTEGER freq; ::QueryPerformanceCounter(&stop); ::QueryPerformanceFrequency(&freq); stop.QuadPart -= m_Start.QuadPart; stop.QuadPart *= 1000000; stop.QuadPart /= freq.QuadPart; if (stop.HighPart != 0) m_Output = -1; else m_Output = stop.LowPart; } protected: LARGE_INTEGER m_Start; int& m_Output; };Damit stoppe ich die Zeit in Mikrosekunden. LARGE_INTEGER habe ich gleich unsigned long gesetzt. Die Umrechnung über QuadPart sieht man im Listing, und 1000*Mikro = 1*Milli. Die Wiederholgenauigkeit ist jedoch nicht sehr berauschend, wenn noch andere Applikationen laufen.
Deshalb ein Frage: Gibt es etwas anderes, das genauer ist als diese Methode mit QPerformanceTimer?
Angewendet wird QPerformanceTimer dann so:
{ // start timer QPerformanceTimer pt(nElapsedTime); // hier, was gemessen werden soll } // end timer