RSS registrovat login
Navigace: předchozí stranaúvodní strana
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
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
V Javě jsem použil tento kód:

long
solStart = System.currentTimeMillis();
// some algorithm
long
solTime = System.currentTimeMillis() - solStart;

Syntax higlighted by Syntax highlighter, available at www.4ITDevelopers.net and www.JakNaWin.com

 C#
funkční kód jsem našel např. na codeSource.net. Kód vypadá takto:

/* Read the initial time. */
DateTime startTime1 = DateTime.Now;
/* Do something that takes up some time. For example sleep for 1.7 seconds. */
Thread.Sleep(
1700
);
/* Read the end time. */
DateTime stopTime1 = DateTime.Now;
/* Compute and print the duration of this first task. */
TimeSpan duration1 = stopTime1 - startTime1; Console.WriteLine(
"First task duration: {0} milliseconds."
, duration1.TotalMilliseconds);
/* Do something that does not have to be measured. * For example sleep for a while. */
Thread.Sleep(
900
);
/* Now we want to measure another task. We store the start time. */
DateTime startTime2 = DateTime.Now;
/* We perform the second task which again takes up some time. * For example we can sleep for 2.1 seconds. */
Thread.Sleep(
2100
);
/* We store the end time of the second task. */
DateTime stopTime2 = DateTime.Now;
/* Compute and print the duration of this second task. */
TimeSpan duration2 = stopTime2 - startTime2; Console.WriteLine(
"Second task duration: {0} milliseconds."
, duration2.TotalMilliseconds);
/* Compute the total execution time. */
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

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: 6921x

Komentáře:
Žádné komentáře dosud nebyly vloženy.

Přidat komentář:
Jméno
E-mail
Web
Titulek
Obsah
thomas sabo rea mbt outlet thomas sabo charms sale louis vuitton taschen kaufen thomas sabo boutique mbt kaufen