Oblicz czas wykonania metody

Możliwy duplikat:
Jak zmierzyć czas działania funkcji?

Mam metodę czasową We / Wy, która kopiuje dane z lokalizacji do innej. Jaki jest najlepszy i najbardziej realny sposób obliczania czasu realizacji? Thread? Timer? Stopwatch? Jakieś inne rozwiązanie? Chcę jak najprecyzyjniejszego i jak najprecyzyjniejszego.

Author: Community, 2012-12-24

5 answers

Stopwatch jest przeznaczony do tego celu i jest jednym z najlepszych sposobów pomiaru czasu wykonania w .NET.

var watch = System.Diagnostics.Stopwatch.StartNew();
// the code that you want to measure comes here
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

Nie należy używać DateTime do pomiaru czasu wykonania w .NET.


Aktualizacja:

Jak zauważył @series0ne w sekcji komentarzy: jeśli chcesz naprawdę precyzyjnego pomiaru wykonania jakiegoś kodu, będziesz musiał użyć liczników wydajności wbudowanych w system operacyjny. następująca odpowiedź zawiera ładne przegląd.

 777
Author: Darin Dimitrov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-09 12:27:28

Z własnego doświadczenia, klasa System.Diagnostics.Stopwatch może być używana do pomiaru czasu wykonania metody, jednak uważaj: nie jest do końca dokładna!

Rozważ następujący przykład:

Stopwatch sw;

for(int index = 0; index < 10; index++)
{
    sw = Stopwatch.StartNew();
    DoSomething();
    Console.WriteLine(sw.ElapsedMilliseconds);
}

sw.Stop();

Przykładowe wyniki

132ms
4ms
3ms
3ms
2ms
3ms
34ms
2ms
1ms
1ms

Teraz się zastanawiasz; "cóż, dlaczego zajęło to 132ms za pierwszym razem, a znacznie mniej przez resztę czasu?"

Odpowiedź jest taka, że Stopwatch nie kompensuje aktywności "szumu tła" w. NET, takie jak JITing. Dlatego przy pierwszym uruchomieniu metody. NET JIT jest pierwszy. Czas potrzebny na to jest dodawany do czasu wykonania. Podobnie, inne czynniki również powodują, że czas realizacji może się różnić.

To, czego naprawdę powinieneś szukać absolutnej dokładności, to Profilowanie Wydajności !

Spójrz na następujące strony:

RedGate ANTS Performance Profiler jest produktem komercyjnym, ale daje bardzo dokładne wyniki. - Boost the wydajność aplikacji dzięki profilowaniu. NET

Oto artykuł StackOverflow na temat profilowania: - jakie są dobre PROFILERY. NET?

Napisałem również artykuł na temat profilowania wydajności za pomocą stopera, na który warto spojrzeć - Profilowanie Wydajności W. NET

 55
Author: series0ne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-06 00:12:46

StopWatch Klasa szuka najlepszego rozwiązania.

Stopwatch sw = Stopwatch.StartNew();
DoSomeWork();
sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);

Posiada również pole statyczne zwane Stopwatch.IsHighResolution. Oczywiście jest to problem ze sprzętem i systemem operacyjnym.

Wskazuje, czy timer opiera się na wydajności w wysokiej rozdzielczości licznik.

 22
Author: Soner Gönül,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-24 09:43:34

Jeśli interesuje cię zrozumieć wydajność, najlepszą odpowiedzią jest użycie profilera.

Inaczej, System.Diagnostyka.Stoper zapewnia timer o wysokiej rozdzielczości.

 17
Author: Jeff Foster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-24 09:32:49

Stoper użyje licznika wysokiej rozdzielczości

Stoper mierzy upłynięty czas, zliczając Tiki timera w mechanizm zegarowy. Jeśli zainstalowany sprzęt i działanie system obsługuje licznik wydajności o wysokiej rozdzielczości, a następnie Klasa Stopwatch używa tego licznika do pomiaru czasu. Inaczej, Klasa Stopwatch używa timera systemowego do pomiaru czasu. Użycie częstotliwości i pola Isighresolution do określenia precyzja i rozdzielczość realizacji czasu stopera.

Jeśli mierzysz IO, twoje liczby prawdopodobnie będą miały wpływ na zewnętrzne wydarzenia, i bardzo bym się martwił. dokładność (jak wskazałeś powyżej). Zamiast tego wziąłbym zakres pomiarów i rozważyłbym średnią i rozkład tych liczb.

 7
Author: Brian Agnew,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-12-24 09:33:44