[Python-Dev] time.clock() on windows (original) (raw)

Sturla Molden sturla at molden.no
Fri Oct 23 19🔞46 CEST 2009


Kristján Valur Jónsson skrev:

Thanks, I'll take a look in that direction.

I have a suggestion, forgive me if I am totally ignorant. :-)

Sturla Molden

#include <windows.h>

union __reftime { double us; __int64 bits; };

static volatile union __reftime __ref_perftime, __ref_filetime;

double clock() { __int64 cnt, hz, init; double us; union __reftime ref_filetime; union __reftime ref_perftime; for (;;) { ref_filetime.bits = __ref_filetime.bits; ref_perftime.bits = __ref_perftime.bits; if(!QueryPerformanceCounter((LARGE_INTEGER*)&cnt)) goto error; if(!QueryPerformanceFrequency((LARGE_INTEGER*)&hz)) goto error; us = ref_filetime.us + ((double)(1000000cnt)/(double)hz - ref_perftime.us); / verify that values did not change / init = InterlockedCompareExchange64((LONGLONG)&__ref_filetime.bits, (LONGLONG)ref_filetime.bits, (LONGLONG)ref_filetime.bits); if (init != ref_filetime.bits) continue; init = InterlockedCompareExchange64((LONGLONG*)&__ref_perftime.bits, (LONGLONG)ref_perftime.bits, (LONGLONG)ref_perftime.bits); if (init == ref_perftime.bits) break; } return us; error: /* only if there is no performance counter / return -1; / or whatever */ }

int periodic_reftime_check() { /* call this function at regular intervals, e.g. once every second /
__int64 cnt1, cnt2, hz; FILETIME systime; double ft; if(!QueryPerformanceFrequency((LARGE_INTEGER
)&hz)) goto error; if(!QueryPerformanceCounter((LARGE_INTEGER*)&cnt1)) goto error; GetSystemTimeAsFileTime(&systime); __ref_filetime.us = (double)(((((__int64)(systime.dwHighDateTime)) << 32) | ((__int64)(systime.dwLowDateTime)))/10); if(!QueryPerformanceCounter((LARGE_INTEGER*)&cnt2)) goto error; __ref_perftime.us = 500000*(cnt1 + cnt2)/((double)hz); return 0; error: /* only if there is no performance counter */ return -1;
}



More information about the Python-Dev mailing list