QueryPerformanceCounter und LARGE_INTEGER



  • Ich versuche die Zeit zwischen zwei Zeitpunkten möglichst genau in Millisekunden zu messen. Dazu hab ich folgenden Code aus Google gefischt:

    LARGE_INTEGER before;
    LARGE_INTEGER after;
    
    QueryPerformanceCounter (&before);
    // Some code
    QueryPerformanceCounter (&after);
    
    // Calculate the diference.
    LARGE_INTEGER diff = after-before;
    LARGE_INTEGER freq;
    
    QueryPerformanceFrecuency (&freq);
    // The frequency is on seconds thus divide by 1000
    freq = freq / 1000;
    
    LARGE_INTEGER milliseconds = diff*freq;
    

    Ist auch alles klar soweit und liefert sicher das richtige Ergebnis, wenn es denn funktionieren würde. Denn die Rechenoperationen (- / und 😉 motzt er als nicht geeignet an. Die MSDN schweigt sich leider darüber aus wie man QueryPerformanceCounter anwenden soll und die Forensuche liefert auch irgendwie nur ein Ergebnis.



  • Ich mache das mit GetTickCount - spricht da was dagegen? Das ist eigentlich einfach zu handhaben. 🙂



  • Jop GetTickCount ist zu ungenau die Zeiten bewegen sich in Dimensionen von 5-30 ms.



  • LARGE_INTEGER before;
    LARGE_INTEGER after;
    QueryPerformanceCounter (&before);
    // Some code
    QueryPerformanceCounter (&after);
    __int64 diff = after.QuadPart-before.QuadPart;
    LARGE_INTEGER freq;
    QueryPerformanceFrequency (&freq);
    // The frequency is on seconds thus divide by 
    freq.QuadPart = freq.QuadPart / 1000;
    __int64 milliseconds = diff*freq.QuadPart;
    

    So kompiliert es zwar bloß kann ich Milliseconds nicht über cout ausgeben 😕

    /Edit: Es geht über printf %I64d (msvc++), aber der Wert der rauskommt ist Käse *grmbl*



  • Ich habe mich jetzt nicht allzu sehr in deinen Code vertieft, aber mir ist aufgefallen, dass ich in einem Beispiel dazu durch die Frequenz geteilt habe und nicht wie du dein Ergebnis mit der Frequenz multipliziert. Damit erhaelt man (nach einem Cast) einen Double und diesen kann man problemlos mit cout ausgeben.

    Gruss,
    DeSoVoDaMu



  • Ja dafür hab ich inzwischen auch ein Beispiel gefunden, funktioniert auch. Ich glaub die komischen Werte beruhen eher auf einem Verständnisproblem oder einem Logikfehler meinerseits. Naja das schau ich mir morgen nochmal an, ansonsten bin ich froh das meine Lib normal einen eigenen High Precision Timer mitbringt 😉



  • #pragma once
    // class used to perform timings

    class CQTimer
    {
    public:
    CQTimer()
    {
    m_dwtime=0;
    QueryPerformanceFrequency((LARGE_INTEGER*)&m_freq);
    }
    // starts the timer
    void Start()
    {
    QueryPerformanceCounter((LARGE_INTEGER*)&m_start);
    }
    // returns the number of milliseconds
    DWORD End()
    {
    __int64 li, diff;
    QueryPerformanceCounter((LARGE_INTEGER*)&li);
    diff = li - m_start;
    diff = (diff * 1000)/m_freq;
    m_dwtime=(DWORD)(diff & 0xffffffff);
    return m_dwtime;
    }

    public:
    DWORD m_dwtime;

    private:
    __int64 m_freq;
    __int64 m_start;
    };


Anmelden zum Antworten