DivideByZeroException zu langsam

7

Das ist extrem langsam:

%Vor%

Das ist ungefähr 5x schneller:

%Vor%

Kann mir jemand sagen warum?

    
Eduardo 02.02.2010, 11:27
quelle

6 Antworten

11

Nur 5 mal schneller? Du überraschst mich. Vermutlich bedeutet dies, dass Ihre Beispieldaten nicht viele Nullen enthalten.

Ausnahmen sind teurer als einfache Vergleiche. Bei richtiger Anwendung (d. H. Bei außergewöhnlichen Umständen) beeinträchtigen sie die Leistung nicht wesentlich - denn wenn Sie genügend Ausnahmen dafür ausstellen, um eine große Wirkung zu erzielen, besteht die Gefahr, dass Ihr Service bereits abgespritzt wird. Es macht ein Problem, wenn Sie Ausnahmen verwenden, um zu versuchen, Bedingungen zu ignorieren, mit denen Sie sehr leicht testen können - wie diese.

Eine Anmerkung zu den Kosten von Ausnahmen: Sie kosten viel mehr im Debugger als bei Ausführung ohne angehängten Debugger; Insbesondere die erste Ausnahme, die eine Menge Ressourcen laden muss, kann Sekunden statt Mikro / Millisekunden dauern. Wenn Sie Code benchmarken, ist es wichtig, dass Sie es nicht in einem Debugger tun - das gilt im Allgemeinen, aber besonders für Ausnahmen.

    
Jon Skeet 02.02.2010, 11:30
quelle
10

Weil Ausnahmen teuer sind.

Wenn eine Ausnahme ausgelöst wird, muss die Laufzeitumgebung eine große Menge an Informationen (z. B. Stack-Traces) auswählen und aufblähen. Dies kostet Zeit und Ressourcen, wenn ein Test für 0-Wert im Vergleich sehr günstig ist.

Siehe diese SO-Frage , in der Sie gefragt werden, wie teuer Ausnahmen für weitere Informationen sind.

    
Oded 02.02.2010 11:28
quelle
5

Err, weil Ausnahmen langsamer als das Überprüfen sind. Ausnahmen enthalten im Allgemeinen eine Menge Infrastruktur, die eine einfache if -Anweisung nicht enthält.

Sie sind keine äquivalenten Operationen, da Sie viele Informationen in einer Ausnahme erhalten haben , auch wenn Sie sie in diesem Fall nicht verwenden .

    
paxdiablo 02.02.2010 11:30
quelle
3
  

Warum sind Ausnahmen langsam?

Da passiert viel, wenn eine Ausnahme ausgelöst und abgefangen wird. Siehe Chris Brummes Beitrag zum verwalteten Ausnahme-Modell und diesen Beitrag zum zugrunde liegenden Win32 SEH-Modell für Details.

  

Warum ist ein einfacher Test schnell?

Weil es nur eine Anweisung ausführt, um abhängig vom Ergebnis des Vergleichs zweier Ganzzahlen zu springen, was viel weniger Arbeit ist als eine Ausnahme.

  

Heißt das, ich sollte immer versuchen, Ausnahmen zu vermeiden?

Nein, das hängt von der Semantik ab. Wenn das Zerlegen durch Null ein wahrer Ausnahmefall ist, den Sie nicht erwarten und den Ihr Programm nicht vernünftig handhaben kann, dann lassen Sie die Ausnahme auftreten und stürzen Sie Ihr Programm ab. Wenn es jedoch ein erwarteter Fall ist und Sie vernünftig damit umgehen können, ist es sinnvoll, die Ausnahme zu vermeiden.

    
Greg Beech 02.02.2010 11:31
quelle
1

Ausnahmen sind extrem langsam. Dies ist der Grund dafür, dass das .Net-Framework über TryParse-Methoden verfügt:

%Vor%

Sie sollten immer versuchen, Ausnahmen zu vermeiden (außer in Ausnahmefällen - haha ​​...)

    
Justin 02.02.2010 11:34
quelle