6
votes

Existe-t-il une pénalité de performance associée à l'appel d'une fonction dans un bloc d'un @>

Cela causerait-il une pénalité de performance, comparée à l'appelant blablea code> sans le bloc d'essai?

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


4 commentaires

J'ai vu cela a demandé ici pour C et C ++. Bien que je ne sois pas positive, la réponse est la même chose, je parie que c'est. Quoi qu'il en soit, vous devez consulter la "comparée à ce que" threads dans les réponses de ces deux langues. Par exemple, voici un: Stackoverflow.com/ Questions / 16784601 / ...


Il existe peut-être une perte mineure d'optimisation du compilateur, mais probablement rien d'autre. (Et "Optimisation de l'objectif-C" est quelque chose d'un oxymoron quand même.)


Pas beaucoup de problème car nous ne jetons pas des exceptions qui souvent dans l'objectif-c :)


@Gavin ... et nous ne pouvons pas les attraper de manière fiable.


3 Réponses :


5
votes

de DOC

Coût zéro @try Blocks

processus 64 bits qui entrent un bloc de coiffé à zéro renonc pénalité de performance. Ceci est différent du mécanisme de 32 bits processus, qui appelle SETJMP () et effectue une "comptabilité" supplémentaire. Cependant, jeter une exception est beaucoup plus chère en 64 bits exécutables. Pour de meilleures performances en 64 bits, vous devriez lancer exceptions seulement lorsque cela est absolument nécessaire.

Donc, pas de frais généraux pour 64 bits Processes


1 commentaires

Il est important de noter que cela est vrai pour Mac OS X uniquement. Sur iOS, la mise en œuvre était toujours comme l'architecture Mac 64 bits.



4
votes

Vous pouvez être intéressé par ce blog ici: LLVM Blog de projet

c'est-à-dire sur Intel et depuis OKT. 2013, à bras aussi, les exceptions C ++ sont maintenant "zéro-coût".

Les exceptions de l'objectif-C sont réalisées en termes de cette mise en œuvre.

Toutefois, la nécessité d'un rainuer désactivera quelques possibilités d'optimisation, de sorte que le code qui nécessite de gérer des exceptions pourrait être moins optimal optimisé que, lorsque aucune exception ne doit être manipulée.


0 commentaires

4
votes

sur certaines plates-formes, @ TRY / @ CATCH est "Coût zéro". Il n'y a pas de code supplémentaire exécuté pour un bloc d'essai tant qu'aucune exception n'est lancée. Il y a des frais généraux supplémentaires sous la forme de données de déruisement des exceptions, mais qui n'occupe pas non plus de mémoire réelle jusqu'à ce qu'une exception soit lancée. Ces plates-formes comprennent les IOS X et 64 bits IOS.

sur certaines plates-formes, simplement entrer @try entraîne des frais généraux de la CPU pour sauver des registres. Ces plates-formes comprennent des OS 32 bits X et IOS 32 bits.


0 commentaires