Zeit der Anwendung messen?



  • Hallo Leute

    habe meinen C-Code compiliert ohne Fehler juhuuu. Es funktioniert auch alles wunderbar, jedoch würde ich gerne die Performance/Geschwindigkeit messen. Welche funktion macht das?

    Also Struktur sollte so aussehen:

    main()
    {
    start messung
    
    //Funktion
    
    ende messung
    ausgabe Zeit in ms oder us
    
    }
    

    Grüße
    Hibert



  • Habe eine Lösung gefunden

    DWORD tick = GetTickCount();
    DWORD time= timeGetTime();
    // Code
    
    printf("Time needed: %i ms",GetTickCount()-tick);//
    printf("Time needed: %i ms \n",timeGetTime()-time); //
    

    Ich bekomme unterschiedliche Ergebnise welches Ergebnis kann ich eher trauen?
    Wie kann ich in us Messen? Bräuchte es genauer



  • Ich weiß nicht, ob das genauer ist:

    #include <time.h>
    
    clock_t start, finish;
    double elapsed_time;
    
    start = clock();
    finish = clock();
    elapsed_time = ((double)(finish - start))/CLOCKS_PER_SEC; // in Sekunden
    


  • Hallo,
    die bisher genannten Timer sind recht ungenau: min. +- 10 ms

    schau mal dort nach:

    QueryPerformanceCounter, QueryPerformanceFrequency

    Gruß Frank



  • Danke Frank!

    //1. Messung
        QueryPerformanceCounter((LARGE_INTEGER*)&g_CurentCount);
    
    // Code
    
    //2. Messung
        QueryPerformanceCounter((LARGE_INTEGER*)&g_LastCount); 
    
    dTimeDiff = (((double)(g_LastCount-g_CurentCount))/((double)g_Frequency)); 
    	printf("Time:  %d ????ns/ms???) \n", dTimeDiff);// ms? ns?
    

    Jetzt hätte ich nur noch eine Frage: Was für einen Wertebereich bekomm ich als Ergebnis im jetztigen Code bekomm ich da eine komsich Zahl mal minus mal plus. Wie stell ich das Ergebnis in us und ms dar?

    Gruß
    Hilbert



  • Es könnte daran liegen, dass Du schon während der Berechnung auf double castest.
    Das Ergebnis erst casten...



  • hmm klappt nicht! jetzt kommt 0 raus... aber die berechnung sollte ja eigentlich auf us genau sein!
    Kann mir vlt jemand am obigen Code sagen wie ich Werte in us und ms bekomme wär echt super!



  • Hallo,

    Wenn du so genau messen willst, musst du auch präziese programmieren.
    Mache dir folgende Punkte klar:

    + Welche Bandbreite haben die verwendeten Variabeln ?
    + Wann (Zeit) läuft der verwendete Counter über ?
    + Wie genau ist der verwendete Counter maximal ?
    + Wann (Zeit) läuft meine verwendete Formel über ?
    + Wieviel Zeit benötigt eine Zeitmessung + Umrechnung ?
    + Also wie genau ist der verwendete Counter + Formel tatsächlich,
    bzw. inweiweit beeinflusst er meine Messung ?

    Hilfe:
    Bitte verwende nicht double sonder arbeite solange wie möglich mit int64

    Für kleine Zeiten (nehme ich mal an):
    tUsed = (t0 - t1) * 1000000 / f0; // [µs]

    Wichtig ist das die Multiplikation vor der Division erfolgt,
    sonst kommt 0 raus!

    Für große Zeiten verwendet man diesen Counter besser nicht

    Darstellung z.B.:
    printf("tUsed = %d.%d [s]\n", tUsed / 1000000, tUsed % 1000000);

    Viel Erfolg, Gruß Frank

    ps. ich hab was gut bei dir 😉



  • Danke Frank! Ja du hast recht ich hab was gut bei dir :)!

    Die Zeitmessung ist für einen Bildverarbeitungsalgorithmus das nur auf 1 Bild läuft, wo ich nur die Zeit der Formel-berechnung brauche, also Bild einlesen/ausgeben und so ist unwichtig! Deswegen sollte die Zeit auf mindestens +-1ms genau sein. Wenn das durch den QueryPerformanceCounter gegeben ist, dann ist mein Problem damit besiegelt :)!

    Nochmals danke und ein schönes WE
    Hilbert 👍


Log in to reply