2009-08-28 38 views
7

Ich möchte eine Antwort von jemandem, der tatsächlich in Echtzeit in C# programmiert oder wer die Sprache Interna wirklich versteht.C# Real Time Try Catch

Ich weiß, dass Ausnahmen nicht verwendet werden sollten, um normale Verarbeitung zu behandeln, sondern nur Fehlerbedingungen zu erkennen. Es gibt viele Diskussionen zu diesem Thema.

Ich würde gerne wissen, ob es eine Verlangsamung der Laufzeit gibt, indem man einfach einen try/catch-Block anlegt (der nie eine Ausnahme fängt, wenn das Programm sowieso nicht enden muss). Der try/catch-Block befindet sich in einer Funktion, die wiederholt aufgerufen werden muss. Ich vermute, dass es nur minimale Kosten gibt.

Können die Kosten in Bezug auf CPU-Zyklen oder andere Aufgaben (gleiche Kosten wie eine Gleitkomma-Multiplikation) oder auf andere Weise quantifiziert werden?

Wir verwenden Microsoft C# .Net 3.5 unter Windows XP.

+1

Werfen Sie einen Blick auf Jon Skeet Ressource auf Ausnahmen und Leistung: http://www.yoda.arachsys.com/csharp/exceptions.html –

Antwort

10

.NET-Ausnahmen haben einen sehr, sehr geringen Overhead, wenn sie nicht ausgelöst werden. Wenn Sie einen Try/Catch-Block an Ort und Stelle haben, wird sich dies nur minimal auf die Performance auswirken. Ich habe fast keine Auswirkungen gefunden, selbst in sehr schnellen, engen Schleifen, um Exception Handling an Ort und Stelle zu haben.

Ausnahmen in .NET sind jedoch sehr teuer, wenn sie ausgelöst werden. Sie neigen dazu, sehr viel Einfluss auf die Leistung zu haben, wenn Sie sie als viele andere Sprachen werfen. Dies liegt an den vollständigen Stack-Informationen, die beim Erstellen der Exception usw. gefunden wurden.

Dies ist das umgekehrte Verhalten zu einigen anderen Sprachen, z. B. Python, bei denen die Ausnahmebehandlung höhere Kosten verursacht, aber das Werfen tatsächlich ziemlich performant ist.

Wenn Sie jedoch besorgt sind, würde ich vorschlagen, dass Sie Ihre Routine profilieren, und testen Sie es selbst. Das war meine Erfahrung nach ziemlich viel Performance-Profiling. Es gibt keinen Ersatz für das Messen in Ihrer eigenen Codebasis.

+0

Eigentlich ein Stack-Trace tritt nicht auf, bis Sie den Zugriff auf StackTrace-Eigenschaft oder wenn die Ausnahme eine Prozessgrenze überschreitet (z. B. remoting/wcf/etc.) Das Erstellen einer Ausnahme ist ebenfalls sehr kostengünstig, da die Konstruktion nur einige Eigenschaften festlegt. Eine moderate Kosten entstehen durch die Einstellung StackCrawlMarks, die einen Stack-Crawl ermöglichen, wenn und wenn der StackTrace angefordert wird ... aber in .NET 2.0 tritt die Ablaufverfolgung nicht bei jedem Wurf auf, es sei denn, Sie greifen tatsächlich darauf zu. – jrista

+0

Ja - ich habe mich tatsächlich auf den Stapelmarkierungsmechanismus bezogen, aber meine Antwort war nicht klar. Dies hat jedoch in meinem Profiling einen ziemlich signifikanten Overhead (dies wird jedoch von perf. Kritischen Systemen angenommen). Rico Mariani hat einen guten Blogbeitrag, der erklärt, warum, aber für mich war das Problem die zusätzlichen Cache-Misses und Seitenfehler: http://blogs.msdn.com/ricom/archive/2006/09/25/771142.aspx –

+0

Danke für diese Info. Leider haben wir nicht die Werkzeuge, um unseren Code zu profilieren ... wir müssen nur den Best Practices folgen. –