Exakte Zeitmessung



  • Wie kann ich die Zeit zwischen zwei Zeitpunkten (z.B. Frames) am genauesten bestimmen.
    Habe es mit timeGetTime() versucht. Aber das hat irgendwie nicht so gut funktioniert. Ich wollte die Dauer dann in sekunden umrechnen.
    Habs also so gemacht:

    DWORD dwTime1, dwTime2;
    float fPeriod;
    
    dwTime1 = timeGetTime();
    
    ....
    
    dwTime2 = timeGetTime();
    fPeriod = (float)(dwTime2 - dwTime1) / 1000.0f;
    

    Aber irgendwie kamen da nur sehr seltsame Zahlen raus, meistens nämlich 0.
    Also wenn ihr ne bessere / genauere Möglichkeit wisst, bitte helft mir.

    Danke Nico



  • Zeig mal deine Ausgabe von fPeriod.



  • Zeitmessung ist unter Windows nicht sehr genau.

    Die Granularitaet bewegt sich zwischen 600 kHz und 50 Hz.

    Am besten ist, Du verwendest die neuen Performance Counters (siehe API Dokumentation).



  • Also, wenn ich längere Zeit genau messen will, benutze ich die Windows
    (oder Bios)-Uhr. Ich merk mir die Zeit am Start, rechne alles in ms um,
    und am ende ziehe ich die aktuelle Zeit von der Zeit am Start ab...

    Ich weiß nicht, ob dir das Hilft 😞



  • noch genauer wäre RDTSC, benutz doch mal die forensuche 😉



  • miller_m schrieb:

    noch genauer wäre RDTSC, benutz doch mal die forensuche 😉

    Hier:

    ULONGLONG GetCPUTicks( void ) {
       _asm {
          rdtsc
       }
    }
    

    Man hat allerdings das Problem damit, entweder die CPU-Frequenz genau kennen zu muessen, oder man muss einen Mittelwert aus Testschleifen ermitteln, um die ungefaehre Tick-Anzahl pro Zeitintervall festzustellen, bevor man damit rechnet.



  • Power Off schrieb:

    Man hat allerdings das Problem damit, entweder die CPU-Frequenz genau kennen zu muessen, oder man muss einen Mittelwert aus Testschleifen ermitteln, um die ungefaehre Tick-Anzahl pro Zeitintervall festzustellen, bevor man damit rechnet.

    jep, ist aber das genauste.

    aus meiner cpu klasse. ist relativ genau, knackpunkt ist das sleep da es betriebssytemabhängig ist.

    //! \brief CPU Geschwindigkeit ermitteln
    			//! \return MHz
    			unsigned long CalculateSpeed()
    			{
    				unsigned int nStartLow, nStartHigh;
    				unsigned int nEndLow, nEndHigh;
    				unsigned long long nStart = 0, nEnd = 0;
    
    #if defined(_MSC_VER)
    				_asm
    				{
    					rdtsc
    					mov [nStartLow], eax
    					mov [nStartHigh], edx
    				}
    #else
    				asm volatile("rdtsc" : "=a"(nStartLow), "=d"(nStartHigh));
    #endif
    
    #ifdef _WIN32
    				Sleep(1000);
    #else
    				sleep(1);
    #endif
    
    #if defined(_MSC_VER)
    				_asm
    				{
    					rdtsc
    					mov [nEndLow], eax
    					mov [nEndHigh], edx
    				}
    #else
    				asm volatile("rdtsc" : "=a"(nEndLow), "=d"(nEndHigh));
    #endif
    
    				nStart |= nStartHigh;
    				nStart <<= 32;
    				nStart |= nStartLow;
    
    				nEnd |= nEndHigh;
    				nEnd <<= 32;
    				nEnd |= nEndLow;
    
    				return(static_cast<unsigned long>(((nEnd - nStart) / 1) / 1000000));
    			}
    


  • Power Off schrieb:

    Man hat allerdings das Problem damit, entweder die CPU-Frequenz genau kennen zu muessen

    Ist zwar erforderlich, aber kein Problem. CallNtPowerInformation wird dir dabei helfen.



  • Danke schonmal für eure Hilfe!

    Scheint mir ja alles um einiges komplexer zu sein als ich das gedacht hatte.
    Sollte halt schon nicht zu ungenau sein. Ich brauch die Zeit zwischen zwei Frames....

    (Eigentlich müsste ich doch da mit Millisekunden recht gut auskommen, aber irgendwie kamen da mit timeGetTime() nur seltsame Dinge raus....)

    Ich werd einfach mal ein paar eurer Tips probieren.


Anmelden zum Antworten