2009-08-28 8 views
7

Chciałbym odpowiedzi od kogoś, kto faktycznie robi programowanie w czasie rzeczywistym w języku C# lub kto naprawdę rozumie wnętrz językowych.C# Real Time Try Catch

Wiem, że wyjątki nie powinny być używane do obsługi normalnego przetwarzania, ale tylko w celu wykrycia błędów. Istnieje wiele dyskusji na ten temat.

Chciałbym wiedzieć, czy jest jakiś czas spowolnienia z powodu po prostu blokowania try/catch (który nigdy nie łapie wyjątku, chyba że program i tak będzie musiał zakończyć). Blok try/catch znajduje się w funkcji, która musi być wywoływana wielokrotnie. Podejrzewam, że jest tylko minimalny koszt.

Czy koszt może być określany ilościowo w kategoriach cykli procesora lub innych zadań (taki sam koszt jak mnożenie zmiennoprzecinkowe) lub w inny sposób?

Używamy Microsoft C# .Net 3.5 pod Windows XP.

+1

Spójrz na zasób Jon Skeet w sprawie wyjątków i wykonanie: http://www.yoda.arachsys.com/csharp/exceptions.html –

Odpowiedz

10

Wyjątki .NET mają bardzo, bardzo niskie koszty ogólne, chyba że zostaną rzucone. Posiadanie bloku try/catch będzie miało bardzo minimalny wpływ na wydajność. Nie znalazłem prawie żadnego wpływu, nawet w bardzo szybkich, ciasnych pętlach, na obsługę wyjątków w miejscu.

Jednak wyjątki w .NET są BARDZO drogie, gdy są rzucane. Mają tendencję do wywierania dużego wpływu na wydajność, jeśli rzucisz nimi niż wieloma innymi językami. Jest to spowodowane gromadzeniem informacji o stosach podczas tworzenia wyjątku, itp.

Jest to zachowanie przeciwne do niektórych innych języków, takich jak python, gdzie obsługa wyjątków ma wyższy koszt, ale rzucanie jest w rzeczywistości dość wydajne.

Jednakże, jeśli się martwisz, sugerowałbym profilowanie rutyny i przetestowanie go samemu. To było moje doświadczenie po dość znacznym profilowaniu wydajności. Nie ma podstawienia do pomiaru we własnej bazie kodów.

+0

Właściwie ślad stosu nie występuje dopóki dostęp do Właściwość StackTrace lub wyjątek przechodzi przez granicę procesu (np. Remoting/wcf/etc.) Tworzenie wyjątku jest również bardzo niskim kosztem, ponieważ konstrukcja ustawia tylko kilka właściwości. Średni koszt wynika z ustawienia procesu rzutowania StackCrawlMarks, który ułatwia indeksowanie stosu, gdy żądanie StackTrace jest wymagane ... ale w .NET 2.0 śledzenie nie występuje przy każdym rzucie, chyba że faktycznie uzyskasz do niego dostęp. – jrista

+0

Tak - rzeczywiście mówiłem o mechanizmie znakowania stosów, ale moja odpowiedź nie była jasna. Ma to jednak wpływ na moje profilowanie, ma dość znaczny narzut (zakłada się jednak, że systemy krytyczne są perfekcyjne). Rico Mariani ma dobry blog wyjaśniający dlaczego, ale dla mnie problemem były dodatkowe błędy w pamięci podręcznej i błędy stron: http://blogs.msdn.com/ricom/archive/2006/09/25/771142.aspx –

+0

Dzięki dla tej informacji. Niestety nie mamy narzędzi do profilowania naszego kodu ... musimy tylko przestrzegać najlepszych praktyk. –