Zeitmessung im Microsekundenbereich



  • Ich empfange nacheinander Pakete, die beim Entgegennehmen einen Zeitstempel verpasst bekommen. Die Pakete kommen im 100 us Takt. Der Zeitstempel sollte das widerspiegeln. Die Applikation ist multithreaded.

    Vor QueryPerformanceCounter wird immer gewarnt. Welche anderen API-Funktionen bietet Windows an, um mit einer Aufloesung von beispielsweise 10 us oder weniger zu messen? (Mir ist klar, Scheduler oder Interrupts diese exakte Zeitmessung auf Dauer durchkreuzen.). Beispielsweise habe ich GetSystemTimeAsFileTime gefunden, habe aber keine Erfahrung damit, ob sie es tut. Der Overhead sollte auch nicht zu gross sein.

    Alternativ kann mittels einer anderen Zeitfunktion das Ergebnis von QueryPerformanceCounter ueberprueft werden. Darauf wollte ich jedoch verzichten.

    Welche WinAPI-Funktion erfuellt meine Anforderungen?


  • Mod

    Du kenst aber den Hintergrund bzgl. QueryPerformanceCounter?
    Und Du weißt warum davor gewarnt wird?
    Und Du weißt auch, dass Dich dieses Phänomen betrifft? 😉

    http://support.microsoft.com/kb/274323/en-us

    Um einen Zeitstempel zu erhalten kannst Du es IMHO dennoch benutzen.
    Ansonsten kannst Du auch einen Mix aus QueryPerformanceCounter und GetTickCount bauen.



  • Ja, Ja, Nein ...

    Natuerlich weiss ich nicht, ob das Problem mich betrifft. Aber die Software soll ja auf verschiedenen Rechnern laufen. Die Hardware der Kunden kann ich nicht kontrollieren. Genauso wenig kann ich kontrollieren, ob PCI gerade extensiv in irgendeiner Weise benutzt wird. Um es nicht allzu kompliziert zu machen, ich gehe nicht davon aus, dass sich die Prozessorfrequenz aendert.

    Aber dann wird es wohl die alternative Variante mit GetTickCount werden.



  • Gibt es denn tatsächliche Probleme mit QueryPerformanceCounter()? Muss es überhaupt ein Zeitstempel sein? Würde nicht ein einfacher Counter, der mit jedem Paket hochgezählt wird (simples InterlockedIncrement()), reichen?


  • Mod

    Vor allem als Stempel genügt QueryPerfromaceCounter ja auch... 😉



  • Zur Erklaerung: Das eigentlich interessante ist die Zeitdifferenz spaeter. Wenn also eine Zeitdifferenz von 5 ms zwischen Paketen gemessen wird, dann liegt das a) an unserer Software oder b) an QueryPerformanceCounter . Ersteres ist ein Bug, letzteres koennen wir nicht aendern. Deswegen muss der Unterschied zwischen beiden detektiert oder aber auf QueryPerformanceCounter fuer den Zeitdifferenz ganz verzichtet werden.



  • Also dann würd ich mal meinen, dass QueryPerformanceCounter() genau das ist was ihr wollt...



  • Martin Richter schrieb:

    Du kenst aber den Hintergrund bzgl. QueryPerformanceCounter?
    Und Du weißt warum davor gewarnt wird?
    Und Du weißt auch, dass Dich dieses Phänomen betrifft? 😉

    http://support.microsoft.com/kb/274323/en-us

    Gabs nicht auch Probleme mit bestimmten frühen multicore CPUs? Ich glaube auch was über Sprünge zurück gelesen zu haben - kann mich aber auch täuschen.

    *Sollte* aber Geschichte sein, ist auf jeden Fall eher Ruhig geworden an der QueryPerformanceCounter Front 🙂



  • Gut, ich werde QueryPerformanceCounter benutzen. Danke!


Anmelden zum Antworten