Saturday, 20 January 2007

Sprawdzanie wydajności

Często zdarza się sytuacja, gdy programista ma kilka pomysłów na zaimplementowanie jednej operacji. Albo do jednego problemu pasuje parę algorytmów, każdy ma swoje zalety i nie do końca wiadomo, który wybrać. Zazwyczaj pisze się wtedy kawałek kodu do szybkiego zmierzenia czasu wykonywania i zapomina o nim po wykorzystaniu. Celem zaoszczędzenia kilku minut następnym razem, wrzucam w sieć prostą klasę do porównywania wydajności.


Mały wyjaśnienie dla dociekliwych: klasa napisana jest tak, by pomiary nie uwzględniały czasu pierwszej kompilacji wykonywanych metod oraz czasu ładowania potrzebnych bibliotek do pamięci. Pomiar wykonywany jest za pomocą DateTime.UtcNow - ta metoda jest nieco szybsza od zwykłego Now, ponieważ nie musi uwzględniać stref czasowych. Ma też tą przewagę nad odwołaniami do API windows, że działa pod linuksem. A mniejszą nieco dokładność łatwo zniwelować odpowiednio zwiększając liczbę wykonań testu.


Przykład wykorzystania:


static void Main(string[] args)
{
PerformanceTestRunner ptr = new PerformanceTestRunner(100000); // liczba przebiegów do wykonania
ptr["Something Old"] = new TestMethod(TestSomething);
ptr["Something New"] = new TestMethod(TestOtherWay);
ptr.Run(1000); // parametr do przekazania metodzie testującej
}

private static void TestSomething(Object o)
{ // tutaj trafia kod do sprawdzenia
}

private static void TestOtherWay(Object o)
{ // tutaj trafia kod do sprawdzenia
}

2 comments:

  1. Profilery mają nieco inne zastosowanie – do namierzania wąskich gardeł i problemów z wydajnością istniejącego kodu. Tutaj chodziło o proste porównanie dwóch rozwiązań jednego (wyizolowanego) zagadnienia.

    ReplyDelete
  2. A nie lepiej skorzystać z profilerów?

    ReplyDelete