Dauer einer Schleife messen?



  • lord_fritte schrieb:

    Hm ne geht irgendwie auch nicht.

    geht schon, steht doch alles in dem pdf. 🙄
    du bist einfach nur zu blöd dazu 😡



  • Ist rdtsc nicht falsch, wenn zwischendurch der Thread wechselt?



  • Diese Variante geht nur mit Intel CPUs und nur wenn der Thread nicht wechselt.
    Es gibt jedoch eine einfachere und zuverlässigere Methode, den Performance Counter. Dieser zählt die CPU-Tackte seit systemstart, jedoch AUßERHALB der CPU. Dadurch ist er Threadunabhängig. Mit den Funktionen QueryPerformanceCounter und QueryPerformanceFrequency kannst du die Zahl der CPU Tackte seit Systemstart und die Zahl der CPU-Tackte pro Sekunde berechnen.
    Dieser Code lässt sich jedoch nur unter Windows benutzen.

    #include <windows.h>
    
    int main()
    {
    LONGLONG llFrequency = 0;
    double   dFrequency = 0.0;
    LONGLONG llStartTime = 0;
    LONGLONG llEndTime = 0;
    double   dTime = 0.0;
    
    // Frequenz abfragen (letztendlich die Hz deiner CPU)
    QueryPerformanceFrequency((LARGE_INTEGER*)(&llFrequency));
    dFrequency = (double)llFrequency;
    
    // Startzeit messen
    QueryPerformanceCounter((LARGE_INTEGER*)(&llStartTime));
    
    // Hier führst du deine Schleife aus
    
    // Endzeit messen
    QueryPerformanceCounter((LARGE_INTEGER*)(&llEndTime));
    
    // Millisekunden berechnen
    dTime = ((double)(llEndTime - llStartTime) / (dFrequency * 0.001));
    
    // Ausgabe
    printf("Vergangene Zeit: %.8f ms", dTime);
    
    return 0;
    }
    


  • Hallo,

    ich bin mir nicht sicher, ob es wirklich angebracht ist; vielleicht ja auch zu altertümlich:
    Ich arbeite mit "einfachen" Prozessoren (µController). Wenn ich genauer wissen muss, wie lange ein Programmteil läuft mache ich Folgendes:

    1. Den Prozessortaktfrequenz herausfinden und Taktdauer berechen. Dabei reicht oft der theoretische Wert.
    1b. Wieviele Takte beinhaltet ein Taktzyklus des jeweiligen Geräts. (zZ. arbeite ich zB mit µControllern, die 6 oder 12 Takte je Zyklus unterstützen)

    2. Herausfinden, wieviele Taktzyklen die einzelnen Befehle des Programmteils zur Abarbeitung benötigen.
    2b. Optional einbeziehen, wie oft eine Schleife durchlaufen wird.

    3. Taktdauer * Takte pro Zyklus * Anzahl der Taktzyklen (* Durchläufe) = Laufzeit des Programm(teil)s

    Ist natürlich mit Aufwand verbunden 😉 Nur so als Anregung 🙂



  • Kolumbus schrieb:

    ich bin mir nicht sicher, ob es wirklich angebracht ist; vielleicht ja auch zu altertümlich:
    Ich arbeite mit "einfachen" Prozessoren (µController). Wenn ich genauer wissen muss, wie lange ein Programmteil läuft mache ich Folgendes:
    ...

    eigentlich macht der µC-bastler das so:
    1. GPIO togglen
    2. oszi dranhalten
    3. fertich.
    wenn's ganz genau sein soll kann man ja noch die laufzeiten der asm-befehle abziehen, die den portpin schalten 😉



  • gibt's ja gar nicht 😉 schrieb:

    eigentlich macht der µC-bastler das so:
    1. GPIO togglen
    2. oszi dranhalten
    ...

    Schlaumeier! Was hälst du jetzt ran, wenn Du kein Oszi hast? 👎 😉

    Oder wolltest Du mir ein Oszi stiften? 😃



  • Kolumbus schrieb:

    gibt's ja gar nicht 😉 schrieb:

    eigentlich macht der µC-bastler das so:
    1. GPIO togglen
    2. oszi dranhalten
    ...

    Schlaumeier! Was hälst du jetzt ran, wenn Du kein Oszi hast? 👎 😉

    Oder wolltest Du mir ein Oszi stiften? 😃

    Man baut sich einen einfachen Zeitnehmer mit einem µc, ist doch klar 😉



  • Kolumbus schrieb:

    Schlaumeier! Was hälst du jetzt ran, wenn Du kein Oszi hast? 👎 😉

    dann besorg dir schnell eins. gehört zur grundausstattung eines jeden µC-hobbyisten.
    🙂



  • Tim schrieb:

    Man baut sich einen einfachen Zeitnehmer mit einem µc, ist doch klar 😉

    gar nicht so abwegig:
    http://sharon.esrac.ele.tue.nl/mirrors/zl1bpu/micro/CNTR/CNTR.htm



  • klar, geht auch 😉 schrieb:

    Tim schrieb:

    Man baut sich einen einfachen Zeitnehmer mit einem µc, ist doch klar 😉

    gar nicht so abwegig:
    http://sharon.esrac.ele.tue.nl/mirrors/zl1bpu/micro/CNTR/CNTR.htm

    Natürlich ist das nicht abwegig. Ich würde nie etwas abwegiges vorschlagen.


Anmelden zum Antworten