windows - Nøjagtig tid delta for moderate tidsintervaller: GetTickCount64 vs QueryPerformanceCounter

Indlæg af Hanne Mølgaard Plasc

Problem



Der er mange spørgsmål (her, her, her) om mekanismer til at få monotonisk tid på Windows og deres forskellige gotchas og faldgruber. Jeg er især interesseret i nøjagtigheden (ikke præcisionen) af de vigtigste muligheder.


Jeg søger at måle forløbet tid på en enkelt maskine, når tiden er i størrelsesordenen flere minutter til en time. Hvad jeg ved indtil videre:



  • QueryPerformanceCounter er fantastisk til korte tidsintervaller, men QPF kan have fejl i størrelsesordenen 500PPM, hvilket betyder en fejl på 2 sekunder i løbet af en time.


    • Mere om det er, at selv på ret nylige processorer, ser folk QPC-fejlbehæftning.

    • Microsoft anbefaler især QPC for kortvarige varighedsmålinger. Men kortfristet er ikke defineret i nogen absolutte tal.


  • GetTickCount64 er ofte citeret som et godt og pålideligt, mindre præcist alternativ til QPC.


    • Jeg har ikke fundet nogen gode oplysninger om rigtigheden af ​​GetTickCount64. Selvom det er mindre præcist end QPC, hvordan sammenligner dets nøjagtighed? Hvilken slags fejl kan jeg forvente i løbet af en time?

    • Nogle programmer spiller med sin opløsning ved at bruge timeBeginPeriod, selv om jeg ikke tror, ​​at det påvirker nøjagtigheden?

    • Dokumenterne snakker om, hvordan GetTickCount64s opløsning ikke påvirkes af justeringer foretaget af GetSystemTimeAdjustment-funktionen. Forhåbentlig betyder det, at GetTickCount64 er monotonisk og ikke justeret nogensinde? Det er usædvanligt formulering ...


  • GetSystemTimePreciseAsFileTime er en mulighed for same-machine time deltaer, hvis jeg deaktiverer automatisk tidsjustering via SetSystemTimeAdjustment. Det understøttes af QPC. Er der nogen fordel at bruge dette over QPC direkte? (Måske gør det sanitering eller tråd affinitetstrik for at undgå nogle af de problemer, der opstår ved direkte QPC-opkald?)


Bedste reference


En så QA jeg fandt linket til dette blogindlæg, hvilket har været særligt nyttigt at læse. Selv om det ikke svarer direkte på mit spørgsmål, dives det ind i, hvordan QPC fungerer på Windows, og hvordan den almindelige Linux monotoniske tid stort set bruger det samme. [5] [7] [8] [9] [10] [11] [12]


Kernen er, at de begge bruger rtdsc, når der findes en invariant TSC på moderne hardware.