[Python-Dev] Use QueryPerformanceCounter() for time.monotonic() and/or time.highres()?

Victor Stinner victor.stinner at gmail.com
Tue Apr 3 13:42:51 CEST 2012


>> You seem to have missed the episode where I explained that caching the last
>> value in order to avoid going backwards doesn't work -- at least not if the
>> cached value is internal to the API implementation.
>>
> Yes, and I can't find it by briefly searching my mail.  I haven't had the energy to follow every bit of this discussion because it has become completely insane.

I'm trying to complete the PEP, but I didn't add this part yet.

> Of course we cannot promise not moving backwards, since there is a 64 bit wraparound some years in the future.

Some years? I computed 584.5 years, so it should not occur in
practice. 32-bit wraparound is a common issue which occurs in practice
on Windows (49.7 days wraparound), and I propose a workaround in the
PEP (already implemented in the related issue).

> Here's actual code from production:
>
> BOOL WINAPI QueryPerformanceCounterCCP( LARGE_INTEGER* li )
> {
>        static LARGE_INTEGER last = {0};
>        BOOL ok = QueryPerformanceCounter(li);
>        if( !ok )
>        {
>                return FALSE;
>        }

Did you already see it failing in practice? Python ignores the return
value and only uses the counter value.

> Even negative delta values of time are usually  harmless on the application level.
> A curiosity, but harmless.

It depends on your usecase. For a scheduler or to implement a timeout,
it does matter. For a benchmark, it's not an issue because you usually
repeat a test at least 3 times. Most advanced benchmarked tools gives
a confidence factor to check if the benchmark ran fine or not.

> I am offering empirical evidence here from hundreds of thousands of computers
> over six years: For timing and benchmarking, QPC is good enough, and will only
> be as precise as the hardware and operating system permits, which in practice
> is good enough.

The PEP contains also different proofs that QPC is not steady,
especially on virtual machines.

Victor


More information about the Python-Dev mailing list