2014-02-25 5 views
5

Würde dies zu einer Leistungseinbuße führen, verglichen mit dem Aufruf von blabla ohne den try-Block?Gibt es eine Leistungseinbuße beim Aufruf einer Funktion in einem @try-Block?

-(void)bla{ 
    @try{ 
     [self blabla]; 
    } 
    @catch (NSException *e) { 
     // Do nothing 
    } 
} 
+2

Ich habe gesehen das hier für C und C++ gefragt. Obwohl ich nicht positiv bin, ist die Antwort die gleiche, ich wette, es ist. Wie auch immer, Sie sollten die "im Vergleich zu was" -Threads in den Antworten für diese beiden Sprachen überprüfen. Zum Beispiel, hier ist eine: http://stackoverflow.com/questions/16784601/does-try-catch-block-decrease-performance – Turix

+0

Es gibt möglicherweise einen kleinen Verlust der Compiler-Optimierung, aber wahrscheinlich nichts anderes. (Und "Objective-C Compiler-Optimierung" ist sowieso etwas wie ein Oxymoron.) –

+1

Kein Problem, da wir keine Ausnahmen, die oft in Objective-C :) – Gavin

Antwort

4

von doc

Zero-Cost @try Blöcke

64-Bit-Prozesse, die einen Null-Kosten @try Block entstehen keine Leistungseinbuße eingeben. Dies ist anders als der Mechanismus für 32-Bit- Prozesse, die setjmp() aufruft und führt zusätzliche "Buchhaltung". Allerdings ist das Auslösen einer Ausnahme in 64-Bit-ausführbaren Dateien mit 64 Bit sehr viel teurer. Für die beste Leistung in 64-Bit sollten Sie Ausnahmen nur dann, wenn unbedingt erforderlich.

so kein Aufwand für 64-Bit- verarbeitet

+1

Es ist wichtig zu beachten, dass dies nur für Mac OS X gilt. Auf iOS war die Implementierung immer wie die 64 Bit Mac-Architektur. –

3

Sie könnten hier in diesem Blog interessieren: LLVM PROJECT BLOG

Das heißt, auf Intel und seit Oktober 2013, auch auf ARM, sind C++ - Ausnahmen nun "Zero-Cost".

Die Objective-C-Ausnahmen werden in Bezug auf diese Implementierung realisiert.

Die Notwendigkeit eines Abwicklers wird jedoch einige Optimierungsmöglichkeiten deaktivieren, so dass Code, der Ausnahmen verarbeiten muss, möglicherweise weniger optimal optimiert ist, als wenn keine Ausnahmen behandelt werden müssen.

3

Auf einigen Plattformen ist @ try/@ catch "Nullkosten". Für einen try-Block wird kein zusätzlicher Code ausgeführt, solange keine Ausnahme ausgelöst wird. Es gibt einen zusätzlichen Overhead in Form von Ausnahme-Unwinding-Daten, der aber auch keinen echten Speicher belegt, bis eine Ausnahme ausgelöst wird. Diese Plattformen umfassen 64-Bit OS X und 64-Bit iOS.

Auf einigen Plattformen verursacht das bloße Eingeben von @try einen gewissen CPU-Overhead, um Register zu speichern. Diese Plattformen umfassen 32-Bit OS X und 32-Bit iOS.

Verwandte Themen