Bejegyzés

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:

  1. Könnyen be lehessen építeni a forráskódba
  2. Tudjon többféle kimenetet produkálni
  3. 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()