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ülllen

    Code 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


  • Mod

    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?!


  • Mod

    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.


Anmelden zum Antworten