2009-08-28 7 views
7

J'aimerais recevoir une réponse de quelqu'un qui fait de la programmation en temps réel en C# ou qui comprend vraiment les langues internes.C# Temps réel Try Catch

Je sais que les exceptions ne doivent pas être utilisées pour gérer le traitement normal, mais uniquement pour détecter les conditions d'erreur. Il y a beaucoup de discussions sur ce sujet. Je voudrais savoir s'il y a un ralentissement du temps d'exécution de simplement avoir un bloc try/catch en place (qui n'attrape jamais une exception à moins que le programme ne doive se terminer de toute façon). Le bloc try/catch est à l'intérieur d'une fonction qui doit être appelée plusieurs fois. Je soupçonne que le coût est minime.

Le coût peut-il être quantifié en termes de cycles d'UC ou d'autres tâches (même coût qu'une multiplication à virgule flottante), ou d'une autre manière? Nous utilisons Microsoft C# .Net 3.5 sous Windows XP.

+1

Jetez un oeil à la ressource de Jon Skeet sur les exceptions et les performances: http://www.yoda.arachsys.com/csharp/exceptions.html –

Répondre

10

Les exceptions .NET ont un coût très, très faible, sauf si elles sont lancées. Avoir un bloc try/catch en place aura un impact très faible sur les performances. Je n'ai trouvé pratiquement aucun impact, même dans des boucles très rapides et serrées, à la mise en place d'exceptions. Cependant, les exceptions dans .NET sont TRÈS coûteuses lorsqu'elles sont lancées. Ils ont tendance à avoir beaucoup d'impact sur les performances si vous les lancez comme beaucoup d'autres langues. C'est le comportement opposé à d'autres langages, tels que python, où la gestion des exceptions a un coût plus élevé, mais le lancement est en fait assez performant. Cependant, si vous êtes concerné, je vous suggère de profiler votre routine et de la tester vous-même. Cela a été mon expérience après un peu de profilage de performance. Il n'y a pas de substitution pour mesurer dans votre propre base de code.

+0

En fait, une trace de la pile ne se produit pas jusqu'à ce que vous accédez à la StackTrace, ou si l'exception passe une limite de processus (c.-à-d. Remoting/wcf/etc.) La création d'une exception est également un coût très faible, car la construction ne définit que quelques propriétés. Un coût modéré est encouru par le processus de lancer de réglage StackCrawlMarks qui facilite une analyse de pile si et quand le StackTrace est demandé ... mais dans .NET 2.0, la trace ne se produit pas à chaque lancer sauf si vous y accédez réellement. – jrista

+0

Oui - Je parlais en fait du mécanisme de marquage de la pile, mais ma réponse n'était pas claire. Ceci, cependant, dans mon profilage, a un surcoût assez important (c'est supposer des systèmes critiques perf, cependant). Rico Mariani a un bon post de blog expliquant pourquoi, mais pour moi, le problème était le manque de cache supplémentaire et les fautes de page: http://blogs.msdn.com/ricom/archive/2006/09/25/771142.aspx –

+0

Merci pour cette info. Malheureusement, nous n'avons pas les outils pour profiler notre code ... il suffit de suivre les bonnes pratiques. –

Questions connexes