Ich bin kürzlich auf dieses Beispiel gestoßen:
Wenn 999 mal von 1.000 eine Ausnahme nicht ausgelöst wird, wird die Ausnahme nur einmal generiert. Andererseits wäre eine Bedingung 999 Mal unnötig aufgerufen worden, daher ist in diesem Fall die Ausnahme überlegen.
In diesem Fall ist es C #, aber im Allgemeinen ist das wahr? Ich hatte zuvor angenommen, dass Try / Catch-Anweisungen einen eigenen Overhead haben, der der Zeit entspricht, die für die Bearbeitung einer Bedingung aufgewendet wird.
Zugegeben, nur Try / Catch-Blöcke an einen Ort zu werfen, an den eine Bedingung normalerweise gehen würde, wäre ein schrecklicher Weg, um zu codieren, aber in Bezug auf die Ressourcen hält diese Aussage?
design
object-oriented
Jane Panda
quelle
quelle
Antworten:
Dies gilt im Allgemeinen für Compiler in kommerzieller Qualität. Bedingungen können jedoch ähnliche Effizienzen unter Verwendung von
assume(false)
Annotationen im Stil erzielen . Die profilgesteuerte Optimierung kann beide übertreffen.Der Grund dafür ist, dass gute Compiler effizienteren Code generieren können, indem sie korrekte Annahmen über die Wahrscheinlichkeit der Ausführung von Code treffen. Da die Konvention besagt, dass Ausnahmen außergewöhnlich sind, generieren die meisten Compiler (ohne Profildaten) Code, der optimal ist, wenn Ausnahmen tatsächlich selten sind.
Beispielsweise kann der Ausnahmebehandlungscode in ein eigenes Segment eingefügt und nur ausgelagert werden, wenn die erste Ausnahme auftritt. Dies bedeutet, dass der CPU-Cache effizienter genutzt werden kann und nur nicht außergewöhnlichen Code gespeichert wird.
quelle
Es gibt Szenarien, in denen try / catch und andere Bedingungen verwendet werden.
Mit einem try / catch nicht der Leistung nicht beeinträchtigt werden, wie ausführlich dargelegt Hier
Über die Leistung hinaus ist eine ordnungsgemäße Ausnahmebehandlung wichtig. Das Letzte, was Sie möchten, sind nicht erfasste Fehler, die einem Benutzer angezeigt werden, fehlerhafte Leistung oder die Anwendung, die hängen bleibt, nachdem ein Problem aufgetreten ist.
quelle
Ein Beispiel für eine bessere Leistung bei Verwendung von try / catch anstelle einer Bedingung ist der Umgang mit Wörterbüchern. Wenn Sie fragen, ob der Schlüssel O (n) enthält, versuchen Sie einfach, auf den Schlüssel zuzugreifen / ihn hinzuzufügen und die potenzielle Ausnahme abzufangen.
quelle