RunTimer, azaz mennyi ideig fut egy kódrészlet?
Ha egy program működik és azt csinálja, amit kell, akkor arra azt mondják jó. Hogy a jóból kiváló legyen, ahhoz a minőségre is hangsúlyt kell fektetni. A minőségi program egyik ismérve, hogy nem akad, nincsenek benne lassú műveletek.
Ahhoz, hogy mérni tudjuk a kód sebességét, sok eszköz áll rendelkezésre, de minden eszköz sokat lassít a programon (közben persze precízen mér!), beépül, beleül minden hívásba… pedig én csak egy pici kódot, egy metódust szeretnék mérni. Erre kerestünk megoldást az alábbi ismérvekkel:
- Könnyen be lehessen építeni a forráskódba
- Tudjon többféle kimenetet produkálni
- Precízen mérje az időt
Megint az IDisposable lett a barátunk! A using segítségével könnyen beépíthető a kódba, pofon egyszerű a használata, sőt kikommentezni is könnyedén lehet.
Az alábbi minimál kód lett a megoldás:
public delegate void RunTimerResult(long ticks); public class RunTimer : IDisposable { private long starttick; private RunTimerResult runtimerresult;
public RunTimer() : this(null) { }
public RunTimer(RunTimerResult runtimerresult) { this.runtimerresult = runtimerresult; starttick = DateTime.Now.Ticks; }
public void Dispose() { long endtick = DateTime.Now.Ticks; if (runtimerresult != null) runtimerresult(endtick - starttick); else Debug.WriteLine(String.Format("{0}ms", (endtick - starttick) / TimeSpan.TicksPerMillisecond));
}
public static void RunTimerResultMessageBox(long ticks) { MessageBoxInfo.Show("Time elapsed", String.Format("{0}ms", ticks / TimeSpan.TicksPerMillisecond)); }
Használata például (Console/Debug ablakba írja a futásidőt)
using(new RunTimer()) DoSomethingSlowly()
vagy (MessageBox-szal jeleníti meg a futásidőt)
using(new RunTimer(RunTimer.RunTimerResultMessageBox)) DoSomethingSlowly()