Zeitmess problem
-
Hallo,
Ich habe ein Problem beim messen von Berechnugszeiten
die funktion low_pass_filter filtert ein bild, und um herauszufinden wie lange es dauert nehme ich die clock() function, das ganze soll gemittelt werden über alle durchläufe, daher muss ich ein array mit number of runs zuerst befülllenCode folgt:
float * calc_pc_tot = (float*)malloc(sizeof(float)*NUMBER_OF_RUNS); for(int i = 0; i < NUMBER_OF_RUNS;i++){ unsigned int start = clock(); low_pass_filter(3,data,data_ref, Width, Height); unsigned int stop = clock(); calc_pc_tot[i] = (float)(stop-start); printf("host: %f millisec \n",calc_pc_tot[i]); }Das Probelm dabei ist dass er einmal einen vernünftigen Wert 16 millisec und jeden 2ten wert auf 0 setzt
also ca so
16,0,16,0,16,0,16,0,16,0....
ich bin ratlos, hat jemand vielleicht ienne Einfall??
Lg
Maz
-
Der Standardzeitmesser ist leider nicht sehr genau aufgelöst. Zwei Möglichkeiten: Du machst viel mehr Durchläufe zwischen Start und Stopp und mittelst dann. Oder du nennst uns dein Betriebssystem, dann nennt dir (hoffentlich) jemand der sich damit auskennt Möglichkeiten einen feineren Zeitmesser zu benutzen.
-
ich benutze win 7 prof edition 64bit!
aber was ich icht genau verstehe, wieso er einmal 0 und einmal 16 sein soll
das spricht eher dafür dass jeder durchgang 8 msec braucht..
seltsam, das ist doch nicht asynchron?!
-
Der Timer wird wohl alle 16 ms einen Schritt weiter gestellt. Deine Funktion braucht anscheinend ungefähr 8 ms, daher findet dies nur bei jedem zweiten Durchlauf statt und bei den anderen Läufen hast du vorher und nachher den gleichen Wert, weil der Timer zwischendurch nicht geändert wurde.
Mit Windowsprogrammierung kenne ich mich leider nicht aus.
-
Stichwort: QueryPerformanceCounter
bb
-
SYSTEMTIME now;
GetSystemTime(&now);now.wMilliseconds;
läuft toll
/// ptimer.h #include <windows.h> #include <time.h> // A Simple Timer // No License // call myTimer.Start() to start // call myTimer.Stop() to stop // return value myTimer.eLAPSED // dont forget to declare a timer struct ATIMER myTimer; SYSTEMTIME now; typedef struct tagATimerP{ void Start(void); bool started; int msecs; int secs; struct tagElapsed{ int Msecs; int Secs; } eLAPSED; bool stoped; void Stop(void); } ATIMER; void ATIMER::Start(void){ GetSystemTime(&now); ATIMER::secs=now.wSecond; ATIMER::msecs=now.wMilliseconds; ATIMER::stoped=false; ATIMER::started=true; } void ATIMER::Stop(void){ GetSystemTime(&now); ATIMER::stoped=true; ATIMER::started=false; ATIMER::eLAPSED.Secs=now.wSecond-ATIMER::secs; ATIMER::eLAPSED.Msecs=now.wMilliseconds-ATIMER::msecs; }
-
Ich würde im Fall eienr Zeitmessung auch auf QueryPerformanceCounter zurückgriefen. SYSTEMTIME kann hier uu unnötige Rechnerei erzeugen.