2013-08-27 22 views
9

Mam aplikację, która ma 4 wątków. Każdy wątek jest w rzeczywistości Timer i wykonuje oddzielne zadanie w określonych odstępach czasu. Te wątki wyświetlają swoje dzienniki za pomocą Console.Writeline. Wydajność jest bardzo ważna w tej aplikacji. Chciałem wiedzieć, czy usunięcie Console.Writeline dostroi wydajność tej aplikacji, czy nie?Wpływ Console.Writeline na wydajność

+5

Każdy kod, który nie zostanie wykonany, poprawi wydajność. Czy to istotne, to kolejne pytanie - i nie da się odpowiedzieć bez dodatkowych szczegółów. Na przykład, w której interwał liczniki czasu uruchamiają, jaką inną pracę wykonują (to może całkowicie osłabić instrukcje 'Console.WriteLine') i ile są już zsynchronizowane (niejawnie) przez inny kod. –

+0

Właściwie to do monitorowania, a nie do debugowania. –

+0

Dlaczego musisz zapytać, czy możesz po prostu spróbować, to nie jest takie trudne ... Dla środowiska produkcyjnego (biorąc pod uwagę znaczenie wydajności), powinieneś zachować tylko najważniejsze komunikaty debugowania. –

Odpowiedz

8

mogą istnieć dwa problemy z Console.WriteLine w odniesieniu do świadczenia usług:

  1. IO nie jest typowo „szybko” operacja.

  2. Połączenia do komórki WriteLine są zsynchronizowane, tzn. Jeśli dwa wątki chcą pisać, jeden z nich blokuje linię WriteLine, czekając na zakończenie drugiej. Od MSDN on console:

I/O operacje, które używają tych strumieni są zsynchronizowane, co oznacza że wiele wątków może odczytać danych z lub zapisu, strumienie.

To znaczy, że jedynym sposobem na zrozumienie, czy czas spędzony na konsoli Console.WriteLine ma wpływ na wydajność konkretnej aplikacji, jest jej profilowanie. W przeciwnym razie jest to przedwczesna optymalizacja.

2

Jeśli służy do debugowania, powinieneś raczej użyć: Debug.WriteLine, ponieważ nie są one zawarte w wersji Release.

+2

Nie widzę, jak to odpowiada na pytanie OP. Możesz także chcieć zebrać wyniki logowania z wersji aplikacji, a poza tym nie ma znaczenia, jaki jest cel rejestrowania. – millimoose

+0

Możesz użyć Trace.WriteLine, zobacz http://stackoverflow.com/questions/179868/trace-vs-debug-in-net-bcl –

7

Tak, wykonanie Console.WriteLine zajmuje mierzalną ilość czasu.

Usunięcie wywołania Console.WriteLine lub zmiana go na zbuforowany wątek tła zapisywania danych naprawdę przyspieszyłoby aplikację.

Jednak Twój przebieg może się różnić w zależności od używanego systemu operacyjnego.

+0

Jedynym problemem z kolejkowaniem go w wątku tła jest to, że rejestrowanie nie jest Dokładne i wątki mogły już zostać zakończone, a rejestracja jest zapisywana na konsoli. –

+0

@JeroenvanLangen To nie jest jedyny problem. Musisz zastanowić się, jaki priorytet miałby wątek logowania. Jeśli jest wyższy niż wątki robocze, nie pomoże w ogóle. Jeśli jest niższy niż wątki robocze, bufor może wyrosnąć poza zakresem, a w aplikacji zabraknie pamięci lub wątki mogą zakończyć się oczekiwaniem na bufor o stałej pojemności. Zasadniczo, aby to zadziałało, musisz wiedzieć na pewno, że aplikacja ma wystarczająco dużo "przestojów", aby zapisać buforowany wynik logowania. – millimoose

Powiązane problemy