Měření časových intervalů
Často se hodí měřit na PC čas - jak dlouho nějaka funkce běžela, atd. V tomto článku najdete pár kódů pro různé jazyky...

Delphi

Delphi
V těchto jazycích lze použít standardní funkci
GetTickCount (resp. je to jenom namapovaná
nějaká windows funkce). Přesnost asi 55 ms, což je nic moc. Poněkud přesnější je použití funkcí
QueryPerformanceCounter a
QueryPerformanceFrequency - příklad použití v časopise
Progres.
Údajně je ale u těchto funkcí problém s přesností na dual-core cpu - viz odkazy v
příspěvku .
V diskuzi na fóru
české hry (je tam link v linku na ten předchozí příspěvek :-)) se ještě objevila zmínka o funkci
timeGetTime, která prý lidem funguje dobře.
Update: na doméně www.ceskehry.cz již není původní obsah, takže si
změňte url na
www.ceske-hry.cz

Java

Java
V Javě jsem použil tento kód:

C#

C#
funkční kód jsem našel např. na
codeSource.net. Kód vypadá takto:
DateTime startTime1 = DateTime.Now;
Thread.Sleep(
1700
);
DateTime stopTime1 = DateTime.Now;
TimeSpan duration1 = stopTime1 - startTime1;
Console.WriteLine(
"First task duration: {0} milliseconds."
, duration1.TotalMilliseconds);
Thread.Sleep(
900
);
DateTime startTime2 = DateTime.Now;
Thread.Sleep(
2100
);
DateTime stopTime2 = DateTime.Now;
TimeSpan duration2 = stopTime2 - startTime2;
Console.WriteLine(
"Second task duration: {0} milliseconds."
, duration2.TotalMilliseconds);
TimeSpan totalDuration = duration1 + duration2;
Console.WriteLine(
"Total duration: {0} milliseconds."
, totalDuration.TotalMilliseconds);
Syntax higlighted by Syntax highlighter, available at www.4ITDevelopers.net and www.JakNaWin.com
Další možnosti měření času
QueryPerformanceCounter + ThreadAffinityMask
Stopwatch z namespace System.Diagnostics - měl by být interop na to předchozí
Environment.TickCount
Doplňující materiály
Diskuze o měření času

Menší román J. Valeriana

Menší román J. Valeriana
text je převzán z diskuze, ale builder občas nefunguje, tak to radši ještě archivuji :-)
PerformaceCounter je jednoznačně přesnější, ale je třeba si uvědomit, že Windows implicitně nejsou realtimový systém a že díky multitaskingu vznikají v rámci provádění kódu jednotlivých vláken nerovnoměrné časové díry kdy celkem běžně může být provádění některého vlákna ve Vaší aplikaci přerušeno na dobu v rozmezí od několika ms až po několik set ms, a to v závislosti na počtu vláken v systému, jejich prioritách a jejich spotřebě přidělovaných časových kvant.
Nelze tedy očekávat, že i když použijete PerformaceCounter tak, že dosáhnete opakované provádění nějakých operací ve stabilně přesných časových intervalech a stejně tak je potřeba počítat s tím, že pokud si změříte pomocí PerformaceCounter okamžik před prováděním nějaké operace a okamžik po jejím dokončení tak rozdíl ani zdaleka nemusí vypovídat o tom kolik skutečného času spotřebovala daná operace jelikož mezi počátkem a koncem mohlo být kromě Vašeho vlákna prováděno klidně i několik jiných vláken patřících i zcela jiným procesům, které jsou shodou okolností zrovna v provozu a třeba zrovna více vytěžuji svá vlákna tj. za jiných podmínek v témže systému se může rozdíl někdy i dost výrazně lišit.
Pokud Vám jde o dosažení opakovaného provádění určitých operací ve stabilně přesných intervalech pak doporučuji k prostudování viz odkazy.
Hard Real-Time with Ardence RTX on Microsoft Windows XP and Windows XP Embedded
http://msdn2.microsoft.com/en-us/library/ms838340.aspx
RTX Evaluation SDK (časově omezená verze k vyzkoušení)
http://www.ardence.com/embedded/products.aspx?ID=227
Pokud Vám jde o dosažení přesnějšího měření provádění určitých operací tj. typické měření OD-DO pak je vhodnější než PerformaceCounter spíš Win API funkce GetThreadTimes.
GetThreadTimes (popis funkce v MSDN)
http://msdn2.microsoft.com/en-us/library/ms683237(VS.85).aspx
Tato funkce měří skutečně spotřebovaný čas vlákna, ze kterého je volána, ale i to má svá úskalí viz poslední odkaz.
Why GetThreadTimes is wrong
http://blog.kalmbachnet.de/?postid=28
Informace ke stavu builder.cz zde
vytvořil Mi.Chal. 30.5. 2006 13:12, naposledy změněnil Mi.Chal. 27.2. 2008 21:37
přečteno: 3203x