Time "funktion" wie



  • Standard-konform und mit nur einer Zeile pro Funktino:

    class CLaufzeitmesser
    {
      std::clock_t m_clock;
    public:
    
      CLaufzeitmesser()
      :m_clock(clock){};
    
      ~CLaufzeitmesser()
      {
        std::cout << "Laufzeit: "<<(1000.*(clock()-m_clock))/CLK_TCK<<" msec"<<std::endl; 
      }  
    };
    
    void foo()
    {
      CLaufzeitmesser Laufzeitmesser;
    
      //hier Dein Code
      //...
    
    }
    

    [ Dieser Beitrag wurde am 02.04.2003 um 10:55 Uhr von kartoffelsack editiert. ]



  • und wie kann ich solch Code in C++ implementieren .

    Habe nämlich für Studienzwecke die Aufgabe, die Laufzeit meines Double Hashing Programms zu messen.

    Wär echt toll, könnte mir jemand helfen (leider findet man nur schwer ne brauchbare Beschreibung in der Literatur, da es nirgends behandelt wird ).

    Reinhard



  • z.b. mit GetTickCount(); (geht nur unter windows, für anderes BSs gibt es ander funktionen

    #include <iostream>
    #include <windows.h>
    
    int main()
    {
        unsigned long startzeit = GetTickCount();
    
        // hier das zu messene
    
        unsigned long endzeit = GetTickCount();
    
        unsigned long differenz = endzeit - startzeit;
    
        cout << "... hat " << differenz << " ms gebraucht." << endl;
        return 0;
    }
    

    die kurtzfassung

    unsigned long startzeit = GetTickCount();
    
        // hier das zu messene
    
        unsigned long differenz = GetTickCount() - startzeit;
    
        cout << "... hat " << differenz << " ms gebraucht." << endl;
    

    es ginge noch kurzer wenn man

    cout << "... hat " << GetTickCount() - startzeit << " ms gebraucht." << endl;
    

    schreiben würde, aber das cout würde das ergebnis verfälschen

    [ Dieser Beitrag wurde am 02.04.2003 um 23:00 Uhr von Dimah editiert. ]



  • kurzer protest gegen bs-abhängige lösungen, kurze variation von kartoffelsacks lösung und erklärung zu clock().
    clock() ist c/c++ standard und kommt aus time.h/ctime.
    prinzip ist das gleiche wie bei vorhergehenden lösungen:

    clock_t start = clock();
    doSomething();
    clock_t dauer = clock() - start;
    
    cout << (static_cast<float>(dauer) / CLOCKS_PER_SEC) << " sekunden benötigt" << endl;
    

    der rückgabetyp von clock() ist clock_t; die einheit des werts ist implementationsabhängig und mit CLOCKS_PER_SEC wie gezeigt in sekunden umrechenbar. der static_cast<float> ist nötig, damit das ergebnis keine ganze zahl ist (keine erklärung hierzu nötig, hoffe ich).

    [ Dieser Beitrag wurde am 03.04.2003 um 04:03 Uhr von mandrill editiert. ]



  • das forum hat eine suchen funktion
    Zeit messen



  • @mandrill:
    clock() ist zu ungenau für messungen...
    es läuft zwar zB auf windows mit offiziellen CLOCK_PER_SEC == 1000 aber in wirklichkeit sind es nur 100 (oder so, auf jedenfall ne sehr schlechte auflösung)

    da nehm ich lieber GetTickCount() unter windows und für posix nehm ich ein gettimeofday() und die sache wird hinter ein paar #ifs versteckt 🙂

    das effektivste ist aber IMHO der asm befehl rdtsc
    aber das ist noch unportabler als GetTickCount/gettimeofday



  • Shade, die Auflösung von clock ist dann wohl die gleiche wie die von GetTickCount und clock ist bei deiner lib mittels GetTickCount implementiert. GetTickCount löst nämlich auch nicht bis auf die millisekunde auf, probiers ruhig mal aus. wenn du da genaueres brauchst, nimm QueryPerformanceCounter. gehört aber nicht hier hin, ist winapi.
    und wenn GetTickCount und clock also gleich gut auflösen, sehe ich keinen grund, die bs-abhängige lösung der std-c++-lösung vorzuziehen.



  • bei visual c++ sieht das aber anders aus. 😉

    clock_t __cdecl clock (
            void
            )
    {
            unsigned __int64 current_tics;
            FILETIME ct;
    
            GetSystemTimeAsFileTime( &ct );
    
            current_tics = (unsigned __int64)ct.dwLowDateTime +
                           (((unsigned __int64)ct.dwHighDateTime) << 32);
    
            /* calculate the elapsed number of 100 nanosecond units */
            current_tics -= start_tics;
    
            /* return number of elapsed milliseconds */
            return (clock_t)(current_tics / 10000);
    }
    


  • dass clock GetTickCount benutzt, war auch mehr eine (naheliegende!) vermutung. GetTickCount (und die meisten anderen windows-zeitfunktionen) löst jedenfalls nur bis auf ~50 ms auf (was wohl wieder von windows zu windows variieren wird - aber, könnte das gar 1/18.2 sein? :D), und wie man ja in dem code-fetzen sieht, verlässt sich clock darauf, dass windows die genauigkeit bietet, die es verspricht.
    meine meinung bleibt: bevor man mit #ifdefs um sich schmeisst, sollte man besser bei clock bleiben.



  • probiert einfach mal das hier

    #include <iostream>
    #include <ctime>
    using namespace std;
    
    int main()
    {
        clock_t c = clock();
        for(int i = 0; i < 30;)
        {
            clock_t tmp = clock();
            if(c != tmp)
            {
                c = tmp;
                cout << c << endl;
                ++i;
            }
        }
        return 0;
    }
    

    da gab es noch was mit multithread


Anmelden zum Antworten