decideMno, věřím Ti, že nejspíš funguje. Jen je otázkou, jestli nejdeš s kanónem na vrabce. Co se ze zdrojáků dá vyčíst je, že tam vlastně ověřuješ, zda sleep(100) skutečně trval 100ms. To chápu. sleep má někdy granualitu kolem 10ms-15ms. Ale tahle granualita je odvozena od plánovače úloh. Ten taky má nějakou podobnou granualitu. Proto mám trochu problém se sleep(100ms), neboť je to příliš krátky čas na měření (na Windows Server může trvat timeslice i 120ms). Pak se může stát, že se měřená aplikace během tak krátke doby nedostane ke slovu.
Pokud bys měřil 1000ms (sekundu), pak si myslím, že měření přes QueryPerformanceCounter je opravdu kanón a navíc nezajišťuje dobrou přesnost (vysvětlím níže). Úplně by postačil GetTickCount a nebo použít GetSystemTime. Nicméně.
Laborujeme tu se dvěmi až třemi hodinami. Pokud použijeme GetSystemTime, nemáme jistotu, že reálná sekunda trvá stejnou dobu jako procesorová sekunda. A v současné době nemáme ani jistotu, že sekunda plánovače úloh trvá stejnou dobu jako sekunda QueryPerformanceCounter. Co se dá možná porovnat je sekunda plánovače úloh a sekunda GetTickCount, protože jsou odvozeny od stejného časovače.
Podívejme se na implementaci QueryPerformanceCounteru. Dneska se používají všelijaké čítače uvnitř procesoru, čímž se dosáhne lepší přesnosti, avšak starší varianta této funkce četla hodnotu z registrů legendárního obvodu 8253/54, který je dodnes emulován v chipsetu desky. Ten má pevnou frekvenci 1193180Hz. Od něho je odvozena frekvence plánovače úloh. Na starších počítačích lze tedy odvodit, že sekunda QueryPerformanceCounteru je stejná jako sekunda plánovače úloh. Ale v současné době už to nelze porovnat. Kdo ti dá jistotu, že Windows znají frekvenci procesoru přesně?
Úplně nejsprávnější řešení by bylo sečíst ProcessTimes všech běžících procesů a touto hodnotou podělit ProcessTimes procesu, který nás zajímá (protože i nečinnost procesoru je považováno za běh procesu s PID 0). Provádět to můžeme v libovolném kroku a nemusíme měřit čas. Ale chápu, že to není tak jednoduché. Jednodušší řešení je odvodit čas od GetTickCount, který je spojen s plánovačem úloh a používá stejný časovač. |