Zeitmessung: Wie lange braucht meine Funktion??



  • Hallo,

    ich weiß nicht genau wie ich effizient und genau die Zeit meiner Funktion ausgeben lassen kann.
    Im Moment mache ich das so:

    struct timeval start, end;
        long sec, micro_sec;
        gettimeofday(&start,(struct timezone *)0);
    
        myFunction();
    
        gettimeofday(&end, (struct timezone *)0);
        sec = end.tv_sec - start.tv_sec;
        micro_sec = end.tv_usec - start.tv_usec;
        if(micro_sec < 0)
        {
            micro_sec += 1000000;
            micro_sec--;
        }
        std::cout << "--------------------------------------------------------------" << std::endl;
        std::cout << "Run time profiling:" << std::endl;
        std::cout << "\tSeconds:       " << sec << "," << micro_sec << std::endl;
        std::cout << "--------------------------------------------------------------" << std::endl;
    

    ich bekomme allerdings immer verschiedene werte - kann das evtl. an den prozessen im hintergrund des Betriebssystems liegen? Gibt es keine Möglichkeit eine exakte angabe zu machen?



  • Keine mit standard C++. Je nach System gibts aber verschiedene Sachen die man machen/verwenden kann um genauer Zeit zu messen und den Einfluss von anderen Prozessen zu minimieren.



  • Ich weiß nicht genau, ob das exakter ist, aber eventuell könntest du die Messung über man: clock durchführen.



  • #pragma warning(push) 
    #pragma warning(disable:4035) 
    u64 rdtsc() 
    { 
    	__asm rdtsc; 
    } 
    #pragma warning(pop)
    

    Musste noch an deinen Compiler anpassen.



  • Michael E. schrieb:

    #pragma warning(push) 
    #pragma warning(disable:4035) 
    u64 rdtsc() 
    { 
    	__asm rdtsc; 
    } 
    #pragma warning(pop)
    

    ...

    Super C++-Code ! 👍 😃

    Gruß,

    Simon2.

    P.S.: Nicht ärgern, ist bestimmt eine gute Lösung für sowas - habe mich nur über cpp-tags darum amüsiert.



  • Unter Windows wenn irgendwie möglich bitte immer QueryPerformanceCounter verwenden und nicht RDTSC, danke.



  • Begründung?



  • hallo,
    danke für eure antworten...

    @ michael: danke für den code - aber was ist denn DAS? 😮

    an meinen compiler anpassen? Arbeite mit Debian Linux und gcc 3.4.3 (ich weiß ist veraltet 🙂 )



  • Fürn gcc sieht das so aus:

    typedef unsigned long long u64;
    
    u64 rdtsc()
    {
        __asm__("rdtsc");
    }
    

    Benutzung entsprechend:

    u64 time = rdtsc();
    
    // irgendwelche Berechnungen
    
    time = rdtsc() - time;
    cout << time;
    


  • @Michael E.:

    Weil QueryPerformanceCounter viele Probleme "kennt" und drum herumarbeitet auf die man stösst wenn man RDTSC verwendet. U.A. dass die Frequenz schwankt mit der RDTSC zählt (Speed-Step und Cool 'n' Quiet etc.) und es Probleme mit Multi Core CPUs gibt.

    QueryPerformanceCounter ist dafür auch leider um einiges langsamer als RDTSC, aber dafür bekommst du (meistens) gute Werte - viel öfter auf jeden Fall als mit RDTSC. Microsoft bringt auch immer wieder Patches heraus falls neue Probleme auftreten wie nicht lange her mit den Athlon X2 CPUs.


Anmelden zum Antworten