QueryPerformanceFrequency



  • Hallo,
    habe ich das richtig verstanden, dass QueryPerformanceFrequency die Anzahl Ticks pro Sekunde liefert?

    int main()
    {
    	LARGE_INTEGER li;
    	if(!QueryPerformanceFrequency(&li))
    		cerr << "nicht vorhanden";
    
    	double ticks_pro_s = double(li.QuadPart);
    	cout << endl << ticks_pro_s; // 3,23e6
    }
    

    Wenn ich das ausführe, bekomme ich als Ergebnis 3,23e6 . Das sind ja bloß 3230000 Ticks pro Sekunde. Dann hätte mein Rechner ja nur 3,23 Mhz (in Wirklichkeit habe ich aber 3,3 GHz). Irngedwie bin ich verwirrt. Kann mich einer aufklären, wo hier der Hacken ist?

    Danke 🙂



  • Steht denn irgendwo in der Doku, dass dieser Wert mit jedem Taktzyklus um eins erhöht wird, oder warum setzt du voraus, dass diese Timerfrequency deiner CPU-Takfrequenz gleichen muss?



  • Decimad schrieb:

    oder warum setzt du voraus, dass diese Timerfrequency deiner CPU-Takfrequenz gleichen muss?

    Ich habe jetzt schon angenommen, dass sie übereinstimmen würden, weil man damit doch auch Zeitmessungen durchführen kann, und wenn sich der Timer nicht an der CPU-Takfrequenz orientiert, würde doch nur Murks rauskommen, oder nicht?



  • Warum kommt denn dann Murks bei raus? Solange der Zähler gleichmäßig hochzählt und man die Frequenz des Hochzählens kennt, ist doch alles in Ordnung. Natürlich begrenzt das die Auflösung, aber zumindest ich habe bislang noch kein Timing im 100 Pikosekundenbereich benötigt. Da stellt sich dann sowieso die Frage, ob man in einem nicht-echtzeit OS richtig ist...



  • Decimad schrieb:

    Solange der Zähler gleichmäßig hochzählt und man die Frequenz des Hochzählens kennt, ist doch alles in Ordnung. Natürlich begrenzt das die Auflösung.

    🙄 Das stimmt natürlich, er tickt nur langsamer, und das schränkt eben die Auflösung ein, nicht mehr und nicht weniger.
    Ich weiß nu auch wieso ich verwirrt war. Ich habe mir ein paar Beispiele mit QPC angeschaut, und da haben einige den Rückgabewert von QueryPerformanceFrequency in einer PC_Freq Variable gespeichert. Ich wurde von dem Namen der Variable fehlgeleitet. 😃

    Danke dir. 😉



  • Da meinten die bestimmt PerformanceCounter_Frequency, nicht PersonalComputer_Frequency 😃



  • QueryPerformanceCounter ist ja da um Zeit zu messen.
    Würde QueryPerformanceCounter CPU Ticks zählen wäre das dann ziemlich blöd, weil man auf Grund von SpeedStep und Co. gar nicht weiss wann die CPU mit welchem Takt gelaufen ist, und daher nicht auf die vergangene Zeit zurückrechnen kann.



  • Und sobald man auf einem Multicore Prozessor lauft, wäre es völlig unbrauchbar...



  • Je nach HAL werden unterschiedliche Mechanismen verwendet...



  • Richtig, wer's genauer wissen will, siehe hier...



  • dot schrieb:

    Und sobald man auf einem Multicore Prozessor lauft, wäre es völlig unbrauchbar...

    Der Takt kann sich ändern bei Stromsparereignissen oder Änderung der CPU Taktfrequenz. Daher in jeder Iteration auch QueryPerformanceFrequency neu abfragen !

    Es ist auf einem Multicore Prozessor unbrauchbar, weil jeder Core seinen eigenen Counter hat. Das kann bei einer anderen Zuordnung der Prozesse und Threads zu den Prozessoren zu (unerwarteten) Problemen führen.



  • Das hängt alles davon ab, welchen Counter QeryPerformanceCounter() tatsächlich verwendet. In der Regel wird es eben nicht den Time Stamp Counter der CPU nutzen...



  • Das mit der Taktänderung bei QueryPerformanceFrequency tritt bei meinem Computer: Intel Core 7 mit Windows 7 tatsächlich regelmäßig auf. Anscheinend abhängig davon, ob die Turbo-Technologie aktiviert oder deaktiviert wird.

    Allerdings ist die Frequenz auch deutlich geringer als der CPU Takt.


Log in to reply