Beste Timefunktion in Windows?



  • Hallo,
    ich probiere gerade welche Zeit Funktion die beste(schnellste) ist, da
    ich z.b. in einem DirectX Program bei jedem Bild 2 Zeitabfragen habe. (Um FPS
    zu berrechnen z.b.)

    #include <windows.h>
    #include <iostream>
    #include <time.h>
    using namespace std;
    
    int main()
    { 
      DWORD dwAZeit, dwEZeit;  //Anfangs-EndZeit;
      const long zyklen = 10000000; //Anzahl der Funktionsaufrufe
    
      //GetTickCount
      dwAZeit = GetTickCount();
      for (int i = 0; i < zyklen; i++)
      {
    	  DWORD tempZeit;
    	  tempZeit = GetTickCount();	
      }
      dwEZeit = GetTickCount();
      cout << "Zeit (in ms) fuer Aufruf von " <<zyklen<< " GetTickCount: " << dwEZeit-dwAZeit << endl;
    
      //**timeGetTime**
      dwAZeit = GetTickCount();
      for (int i = 0; i < zyklen; i++)
      {
    	  DWORD tempZeit;
    	  tempZeit = timeGetTime();	
      }
      dwEZeit = GetTickCount();
      cout << "Zeit (in ms) fuer Aufruf von " <<zyklen<< " timeGetTime: " << dwEZeit-dwAZeit << endl;
    
      //**time**
      dwAZeit = GetTickCount();
      for (int i = 0; i < zyklen; i++)
      {
    	time_t tempZeit;
    	time(&tempZeit);	
      }
      dwEZeit = GetTickCount();
      cout << "Zeit (in ms) fuer Aufruf von " <<zyklen<< " time: " << dwEZeit-dwAZeit << endl;
    
    }
    

    Ausgabe:

    Zeit (in ms) fuer Aufruf von 10000000 GetTickCount: 131
    Zeit (in ms) fuer Aufruf von 10000000 timeGetTime: 991
    Zeit (in ms) fuer Aufruf von 10000000 time: 1031
    Press any key to continue

    Gibt es noch mehr Zeitmethoden in C oder Windows?
    Und warum diese Unterschiede?
    time ist doch C/C++ intern, und GetTickCount ist WinAPI.
    WinAPI müßte doch normalerweise länger brauchen.



  • Die genauste funktion is die tickcount (die vergangen Takte des cpu die vergangen sind)

    inline __int64 readc() {
        __asm rdtsc
    }
    

    Diese funktion gibt diese Takte zurück die vergangen sind

    Man muss aber wissen wieviel Herz der cpu hat um in milisekunden umzurechnen

    sec = Takte/Hz



  • Halte ich für zu unzuverlässig. Aber QueryPerformanceCounter() passt und hat auf meinem Prozessor > 4 Million Tics/Sec.



  • spjoe: rdtsc funktioniert ausserdem nicht auf allen Prozessoren (erst ab Pentium).



  • Die beste ist im XGAmesSDK drin. 😎

    Bye, TGGC (Denken, und gut ist.)



  • TGGC|work schrieb:

    Die beste ist im XGAmesSDK drin. 😎

    falsch.



  • Optimizer schrieb:

    Halte ich für zu unzuverlässig.

    Hältst du? Wieso?



  • Also mein AMD64 kann sich rauf und runter takten. Gibt bestimmt noch mehr Dinge, die da schiefgehen könen. Bei Konsolen ist es angeblich nicht unüblich, mit den Takten zu timen, aber hier...
    Zählt das eigentlich nur die Takte, die dein Programm macht? Dann ist es eh schon nicht zu gebrauchen.
    Ich sehe aber das Problem nicht, reichen dir 4Mio Tics in der Sekunde nicht?



  • Naja ich wollt halt bloß Optimieren, und da GetTickCount sprich WinApi aufrufe schneller sind, werd ich die in Zukunft nehmen.



  • Ovaron123 schrieb:

    Naja ich wollt halt bloß Optimieren, und da GetTickCount sprich WinApi aufrufe schneller sind, werd ich die in Zukunft nehmen.

    GetTickCunt?? Naja...

    Trotzdem: schon mal was von profilern gehört?



  • Hm hab grad in google geschaut. Hört sich interessant an.
    Bloß hab ich nur was für Linux gefunden.
    http://speedup.superhits.ch/profiler.html
    Gibts das auch für Windows?



  • Es gibt einen von Intel namens VTune und bei VisualStudio soll auch einer dabei sein (hab ihn nie gefunden).



  • Von AMD gibt (gab?) es noch den CodeAnalyst und dann gibt es noch den DevPartner Profiler in der Community Edition kostenlos.



  • VC++: AMD Codeanalyst
    .Net: nprof



  • Ovaron123 schrieb:

    Naja ich wollt halt bloß Optimieren, und da GetTickCount sprich WinApi aufrufe schneller sind, werd ich die in Zukunft nehmen.

    Oh uh ah oh. So etwas tut immer weh. Sicher gut gemeint, aber so optimiert man einfach nicht. Vorallem ist deine Aussage eigentlich ziemlich dämlich.

    Problematisch sollte es zum Beispiel werden, wenn ein WinAPI Aufruf in einem Kernel Aufruf endet und erst in den Kernelmodus gewechselt werden muss. Deswegen solltest du ein wenig differenzierter arbeiten.

    Benutz zum Beispiel einen Profiler, wie es bereits Shade vorgeschlagen hat.



  • Oh uh ah oh. So etwas tut immer weh. Sicher gut gemeint, aber so optimiert man einfach nicht. Vorallem ist deine Aussage eigentlich ziemlich dämlich.

    Naja, wenigstens weiß ich jetzt das es dafür extra Programe gibt. Wieder was gelernt 😉



  • MaSTaH schrieb:

    Es gibt einen von Intel namens VTune und bei VisualStudio soll auch einer dabei sein (hab ihn nie gefunden).

    Bei Visual Studio 6 ist das glaube ich ab der Professional-Version drin (unter Build->Profile, sofern es noch bei den Linker-Einstellungen aktiviert ist...)



  • Optimizer schrieb:

    Also mein AMD64 kann sich rauf und runter takten. Gibt bestimmt noch mehr Dinge, die da schiefgehen könen.

    Stichwort Enclave auf meinem Athlon mobile Notebook im Akkumodus.
    Startet mit 780 Mhz, wegen 100% CPU schaltet er auf 1,66 Ghz -> Spiel wird unspielbar schnell 😮





  • Hm danke fuer den Link.
    Bei dem Program kommt genau das gleiche raus wie bei mir.
    GetTickCount ist (bei mir) am schnellsten.


Log in to reply