Wieviel Zeit brauchen Try…Catch…Finally ?

Die Fehlerbehandlung mit Try…Catch…Finally stand bei mir immer unter dem Verdacht, einiges an Performance zu fressen. Warum dies so ist, kann ich nicht genau sagen. Jedenfalls habe ich anlässlich eines Threads auf XNA.mag einfach mal einen Benchmark durchgeführt um die unterschiedlichen Arten der Fehlerbehandlung einem Test zu unterziehen und einfach mal auszuprobieren, welche Art am schnellsten ist.

Verwendet habe ich dazu ein Benchmark-Framework, daß ich vor langer Zeit mal entwickelt habe um genau solch einfachen Dinge schnell und effektiv testen zu können.

Index - Description - Ticks Total - Ticks/Operation - ms Total - ms/Operation 
1 - without exception handling: 10261246, 10, 4776, 0 
2 - with exception handling: 10458052, 10, 4867, 0 
3 - with exception handling and finally: 10650060, 10, 4957, 0 
4 - with multi exception handling: 10227597, 10, 4760, 0 

Die Test sollten mehr oder weniger selbsterklärend sein. Ohne Exception-Handling, dann mit, dann zusätzlich ein finally und zu guter letzt mit mehreren Catch-Anweisungen für unterschiedliche Exceptions.

Die Werte liegen alle so nah beieinander, daß man von Meßungenauigkeiten reden kann. Fakt ist jedenfalls, daß eine Fehlerbehandlung als solche die Geschwindigkeit nicht negativ beeinflusst. Natürlich kostet der Code, der zur Fehlerbehandlung ausgeführt wird (also z.B. das Anzeigen eines Hinweises) Zeit, aber die Fehlerbehandlung als solche nicht oder nur sehr minimal.

Ich möchte hier nicht diskutieren, wann eine Fehlerbehandlung mit Try…Catch…Finally Sinn macht und wann nicht, denn das würde den Rahmen dieses Miniartikels ziemlich sprengen. Aber das Laufzeitverhalten ist jedenfalls kein Argument gegen diese Art der Fehlerbehandlung.

Advertisements

Veröffentlicht am 11.04.2010 in C#, Grundlagen, Optimierung und mit , , , , , , , getaggt. Setze ein Lesezeichen auf den Permalink. 2 Kommentare.

  1. Erst mal großen Lob und fettes Dankeschön für die vielen nützlichen Grundlagen. Es gibt genug Tutorials etc. für Neuanfänger im Netz. Hier ist es eher für, die Interessant, die mehr als nur den Beginn wissen wollen! 😀 Das sehr positive bei deinen Artikeln ist, dass sie SEHR verständlich sind. Danke!

    Als ich diesen Artikel gelesen habe, hat es mich mal angereizt in meinem Projekt mal die Try & Catch ‚es auszutauschen. Ich benutze die TiledLib (TiledQT) und da kann es halt mal sein, dass beim Einlesen ein Layer oder eine Eigenschaft nicht vorhanden ist, weil der Mapperdussel sie halt vergessen hat. Dieses wollte ich Abfangen und stattdessen den Standardwert setzen.
    An zwei Stellen kam sogar gar nichts in die Catch Klammer.

    Da ich momentan im Praktikum in Nord Irland bin, habe ich mein Notebook dabei, was nicht grade so Leistungsfähig ist, wie mein Rechner, was aber auch seine Vorteile hat, weil man sofort Performanzbremsen mitbekommt. Und bei meinem Game hat die Figur alle paar Sekunden in einem bestimmten Takt kurz gestockt, Wenn man spielen würde, wäre das nicht wirklich aufgefallen, wenn man aber ganz langsam beobachtet, (hab ich zB. als ich die Kollision eingeführt habe) fällt es halt auf.

    Tatsache, nachdem ich alle Try und Catches an wirklich unnötigen Stellen eigentlich durch if (layer != null) ….. else …. ersetzt habe, läuft alles nun flüssig!

    Schon witzig, was manchmal so „Kleinigkeiten“ ausmachen können.

    • Vielen Dank für das Lob und den umfangreichen Kommentar. Das ist ein Teil der Motivation hinter diesem Blog 😀

      Viele Kleinigkeiten machen es oft aus und isoliert gesehen ist es nicht schlimm. Die Summe von diesen Kleinigkeiten und unsauberen Entwicklungen entscheidet am Ende aber oft über die Qualität eines Spiels oder Programm.

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: