2010-09-10 15 views
9

Intendo nell'attuale implementazione di clang o versione di gcc.Qual è il costo dell'utilizzo di eccezioni in Objective-C?

I ragazzi di C++ e Java mi dicono sempre che le eccezioni non costano nessuna prestazione a meno che non vengano lanciate. Lo stesso vale per Objective-C?

+0

Sono piuttosto sicuro che i ragazzi del C++ di solito vi dicano che i costi delle eccezioni sono * trascurabili * a meno che non vengano lanciati. –

risposta

9

I ragazzi di C++ e Java mi dicono sempre che le eccezioni non costano nessuna prestazione a meno che non vengano lanciate. Lo stesso vale per Objective-C?

Risposta breve

Solo nel 64-bit OS X e iOS.

Non sono completamente gratuiti. Per essere più precisi, il modello è ottimizzato per minimizzare i costi durante l'esecuzione regolare (spostando le conseguenze altrove).

Risposta dettagliata

su 32 bit OS X e iOS, le eccezioni hanno runtime costa, anche se non sono gettati. Queste architetture non utilizzano Eccezioni costo zero.

Con OS X a 64 bit, ObjC è passato a prendere in prestito le "Eccezioni di costo zero" del C++. Le eccezioni di costo zero hanno un overhead di esecuzione molto molto basso, a meno che non siano state generate. Le eccezioni di costo zero spostano in modo efficace il costo di esecuzione in dimensioni binarie. Questo è stato uno dei motivi principali per cui inizialmente non erano stati utilizzati in iOS. L'abilitazione di eccezioni C++ e RTTI può aumentare le dimensioni binarie di oltre il 50% - naturalmente, mi aspetto che questi numeri siano molto più bassi in ObjC puro semplicemente perché c'è meno da eseguire quando si srotolano.

In arm64, il modello di eccezione è stato modificato da Salto in lungo salto Salto a Eccezioni di costo zero derivate da Itanium (a giudicare dal gruppo).

Tuttavia, programmi Idiomatic objc non sono scritte o preparati per recuperare da eccezioni, così si dovrebbe prenotare il loro uso per situazioni che non si intende recuperare da (se si decide di utilizzare affatto). Maggiori dettagli in Clang manual on ARC e in altre sezioni della pagina di riferimento.

+3

Inoltre, è necessario indicare i problemi che le eccezioni causano per ARC: http://clang.llvm.org/docs/AutomaticReferenceCounting.html - "L'impostazione predefinita delle eccezioni di codice imporrebbe severe penalità in termini di runtime e codice sul codice che in genere non si preoccupa della sicurezza delle eccezioni, pertanto, il codice generato da ARC perde per impostazione predefinita sulle eccezioni, il che va bene se il processo è sarà comunque terminato immediatamente. " –

+0

@BradLarson ottimo riferimento - grazie +1 e aggiunto. può valere la pena notare che l'unica parte che * è * veramente specifica per ARC all'esecuzione è: * "ARC termina la durata degli oggetti' __weak' quando un'eccezione termina il loro scope a meno che le eccezioni non siano disabilitate nel compilatore. "*. la descrizione collegata aiuta certamente a qualificare esempi del motivo per cui le eccezioni non possono essere recuperate da (in modo affidabile, in un modo ben definito) nei programmi ObjC. – justin

+0

Questo va bene per me. Spero che lascino così :-) Come programmatore di Eiffel odio le eccezioni e le uso estremamente limitate. – Lothar

6

Secondo alcune note di rilascio del 2007 per il runtime Objective-C in Mac OS X v10.5, hanno riscritto l'implementazione a 64 bit delle eccezioni Objective-C per fornire blocchi di prova "a costo zero" e interoperabilità con C++ .

Apparentemente, questi blocchi di prova "a costo zero" non comportano alcuna penalità di tempo quando si immette un tentativo, diversamente dalla controparte a 32 bit che deve chiamare setjmp() e altre funzioni. Apparentemente il loro lancio è "molto più costoso".

Questo è l'unico bit di informazioni che riesco a trovare nelle note di rilascio di Apple, quindi dovrei presumere che questo si applica ancora ai runtime di oggi, e come tale, eccezioni a 32 bit = costoso, eccezioni a 64 bit = "costo zero "

+0

Per completezza [C++ a costo zero a 64 bit - Eccezioni compatibili] (https://developer.apple.com/library/mac/#releasenotes/Cocoa/RN-ObjectiveC/_index.html#//apple_ref/doc/ uid/TP40004309-CH1-DontLinkElementID_11) –

Problemi correlati