2008-09-28 16 views
6

Potrzebuję wykonać niektóre testy wydajności w programach .NET (C#) w Windows, ale nie przeprowadziłem testów porównawczych w świecie Windows. Przyjrzałem się używaniu monitora wydajności Windows 2000/XP z niestandardowymi licznikami do tego, ale nie sądzę, że jest to dokładnie to, czego chcę.Jaki jest najlepszy sposób na porównywanie programów w systemie Windows?

Czy w systemie Windows XP istnieją dobre udogodnienia systemowe, czy muszę po prostu użyć System.Diagnostics.Stopwatch [edytuj] i pisać dzienniki tekstowe w celu ręcznej interpretacji, czy jest coś innego?

Edytuj: czy istnieje coś innego niż System.Diagnostics.Stopwatch?

+0

tak, że inni ludzie mogą korzystać z dodatkowych odpowiedzi, myślę, że byłoby lepiej dla aby ponownie otworzyć pytanie. –

+0

Aggh, kolejna lekcja na temat równoległości poszło nie tak ... –

+0

@ Michael Ratanapintha: dbać o opracowanie? –

Odpowiedz

5

Do mikro-testów bardzo mi się podoba MeasureIt (można go pobrać z http://msdn.microsoft.com/en-us/magazine/cc500596.aspx). Jest to projekt testowy napisany przez Vance Morrison, Performance Architect na CLR. Obecnie ma dobry zestaw testów porównawczych dla wielu podstawowych metod .Net/CLR. Najlepsze jest to, że nie ma nic prostszego w dostosowywaniu i dodawaniu nowych testów porównawczych dla wszystkiego, co chciałbyś przetestować. Po prostu uruchom "MeasureIt/edit" i uruchomi VS z projektem dla siebie, abyś mógł zobaczyć, jak te testy są napisane i dodać nowe w podobny sposób, jeśli chcesz.

Jak już zostało powiedziane, StopWatch jest prawdopodobnie najłatwiejszy do zrobienia, a MeasureIt używa StopWatch pod spodem dla jego taktowania, ale robi też kilka innych rzeczy, na przykład, uruchamiając blok kodu X razy, a następnie dostarczając statystyki dotyczące przebiegów i nie.

8
using System.Diagnostics; 
.... 

Stopwatch sw = new Stopwatch(); 

sw.Start(); 

// Code you want to time... 

// Note: for averaged accuracy (without other OS effects), 
//  run timed code multiple times in a loop 
//  and then divide by the number of runs. 

sw.Stop(); 

Console.WriteLine("Took " + sw.ElapsedTicks + " Ticks"); 
+0

Powinieneś także oddzielić pierwszy przebieg od uśrednionych wyników, ponieważ może on być mocno przekrzywiony z powodu kompilacji JIT. –

+0

Ed. S: Dobrze, ale niekoniecznie. Jeśli kod działa tylko raz w rzeczywistości, to prawdopodobnie trzeba wziąć pod uwagę czas JIT. –

+1

Oczywiście, nie zamierzałem całkowicie lekceważyć tych informacji, tylko po to, aby je odseparować, aby nie średnia w górę. Dopóki osoba przeprowadzająca test zdaje sobie sprawę z tego faktu, powinna być w porządku. Zmieniłem procedurę analizowania XML, która może być wywołana na całkiem sporych porcjach danych (w stosunku do tego, co jest typowe w mojej aplikacji), a pierwsze przejście trwało ~ 931ms, podczas gdy wszystkie kolejne wywołania trwały ~ 91ms. –

3

To nie może być to, co chcesz, ale oferuje wiele użytecznych dotTrace diagnostykę i jest zintegrowany z Visual Studio.

4

Istnieje wiele profilerów. Oto niektóre z tych, które znam:

Jeśli pójdziesz na z użyciem System.Diagnostics.Stopwatch, będzie w stanie instrumentu i mierz tylko poszczególne punkty kodu, w których wyraźnie umieszczasz Start/Stop wokół. Jest to wystarczająco dobre do mierzenia konkretnych elementów, takich jak ciasna pętla lub podobne rzeczy, ale nie da pełnego obrazu miejsca, w którym program spędza większość czasu.

4

Jeśli chcesz tylko kilka szybkich numerów, możesz użyć Powershell do wykonania ogólnego czasu. Użyj cmdletu komendy miernika. Jest to w przybliżeniu odpowiednik "czasu" w systemie Unix.

> measure-command { your.exe arg1 } 

Days    : 0 
Hours    : 0 
Minutes   : 0 
Seconds   : 4 
Milliseconds  : 996 
Ticks    : 49963029 
TotalDays   : 5.78275798611111E-05 
TotalHours  : 0.00138786191666667 
TotalMinutes  : 0.083271715 
TotalSeconds  : 4.9963029 
TotalMilliseconds : 4996.3029 
Powiązane problemy