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
}
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.
ReplyDeleteA nie lepiej skorzystać z profilerów?
ReplyDelete