000
29.07.2005, 13:05 Uhr
RHBaum
|
Wir verwenden zum zeitmessen 64 Bit zeitstempel. Zum korrelieren brauchen wir den Systemcounter auf nanosekunden Basis ...
Hier nen Schnell zusammengeschustertes Testprogramm .... (Konsole)
C++: |
// QueryPerfCheck.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung. //
#include "stdafx.h" #include <iostream> #include <windows.h>
static inline ULONGLONG getSysTicks() { LARGE_INTEGER lbuff; lbuff.QuadPart = 0; ::QueryPerformanceCounter(&lbuff); return lbuff.QuadPart; } static inline ULONGLONG getSysFreq() { LARGE_INTEGER lbuff; lbuff.QuadPart = 0; ::QueryPerformanceFrequency(&lbuff); return lbuff.QuadPart; } inline static double Get_TimeResolution_usec() { LARGE_INTEGER lr; ::QueryPerformanceFrequency(&lr); return static_cast<double>(lr.QuadPart / 1000000.0); } static inline ULONGLONG Ticks2NS(ULONGLONG aTicks) { static ULONGLONG NSperTick = static_cast<ULONGLONG>(1000000000) / getSysFreq(); return aTicks * NSperTick; }
int main(int argc, char* argv[]) { ULONGLONG lStart = getSysTicks();
for(int i = 0; i < 10; ++i) { ULONGLONG qperyValue = getSysTicks(); ULONGLONG qfreqValue = getSysFreq(); ULONGLONG nsAll = Ticks2NS(qperyValue); ULONGLONG nsakt = Ticks2NS(qperyValue-lStart); ULONGLONG ms = nsakt / 1000000;
char buffer[1024]; _snprintf(buffer,1024,"QueryPerfomranceCounter : %20.20I64u\nQueryPerfomranceFrequency : %20.20I64u\nNanosec gesamt : %20.20I64u\nNanosec seit Start : %20.20I64u\n ms seit Start : %1.1I64u\n \n",qperyValue,qfreqValue,nsAll, nsakt,ms ); std::cout << buffer; ::Sleep (1000); } return 0; }
|
das static steht vor den Funktionen, weil die eigentlich im richtigen programm Methoden (static) von ner klasse sind ... hab die nur kopiert ....
Funktioniert bei meinem PC ohne Probs ... ich krieg einigermassen plausieble Zeitstempel .... (WinXP, MSVS Version 6.0 .... Pentium 4 1000 )
Auf einigen anderen rechnern hab ich folgendes Sympthom : QueryPerformanceCounter - Wert ok QueryPerformanceFrequency - Wert ok
Alle anderen Werte auf 0 !
Also sobald ich Ticks2NS benutze, wird alles 0 ....
Rechne ich in doubles um und multiplizier / dividier mit doubles , funktioniert es, ist aber ungenauer ....
Warum koennen die einen rechner mit 64 bit multiplication umgehen, die anderen nicht ...
Betriebssystem ist ueberall WIndows XP nich auf allen wo es funktioniert ist MSVS 6.0 drauf Auf denen wo es nicht funktioniert ist aber auch kein MSVS drauf ....
Prozessoren sind alles Pentiums (PIII - PIV)
Woran kann das liegen ??? Oder seh ich nen Schnitzer der zu undef. Verhalten fuehrt, einfach nicht ? Getestet auf allen rechnern mit der release Version, so dass alle die theorethisch selbe CRT anziehen ... die dbg version funktioniert auf den rechnern mit installiertertem VC 6.0 genau wie die release version ...
muss ich 64 bit rechenoperationen nu selber implementieren, denk das sollte der MS compiler koennen (das release testprogramme wurde auf nur einem (meinem) Comp compiliert) :-(
Ciao .... Dieser Post wurde am 29.07.2005 um 13:15 Uhr von RHBaum editiert. |