decideOno to je ještě zamotanější. GetProcessTimes ve skutečnosti vrací součet všech čítačů, které jsou umístěné v TLS každého threadu. Funkce pouze projde všechny thready a patřící procesu a sečte jejich čítače. (Existuje i funkce GetThreadTimes.). A jak se čas běhu procesu/threadu počítá? Přijdete na to, že to není moc přesné. Kdykoliv je vláknu odebráno časové kvantum, započítá si na čítači jedničku. Děje se ale pouze v případě, že vlákno je přerušeno časovačem. Pokud je třeba přepnout z jiného důvodu, přepnutí se nezapočítá. Ten jiný důvod je například čekání na signalizační objekt, Sleep nebo SwitchToThread. Z toho důvodu je čas běhu vlákna, které začne čekat na událost, započítán do času vlákna, jenž, po zastavení čekajícího vlákna, pokračuje v běhu. Čas běhu vlákna je pak dáno počet přepnutí x doba časového kvanta
Jinak to co píšeš o frekvenci je trochu divné. Ano QueryPerformanceCounter skutečně může mít přesnost rovnou frekvenci procesoru, ale také nemusí. Záleží na implementaci. Každopádně je tato hodnota (frekvence čítače) je stejná bez ohledu na aktuální procesory. Microsoft ovšem píše, že v ovladačích bývají chyby a často způsob implementace vede k tomu, že každý procesor má jinou hodnotu v čítači.
Každopádně čas běhu procesu / threadu není odvozeno od frekvence. |