Où se situe Objective-C dans le continuum des performances linguistiques?

20

Il semble y avoir beaucoup de discussions sur les divers avantages de la vitesse du C ou du C ++ par rapport à Java ou Python, mais je vois rarement Objective-C mentionné. Où se situe-t-il approximativement en termes de performances linguistiques?

Fomite
la source
23
1986 - Brad Cox et Tom Love créent Objective-C, annonçant "ce langage a toute la sécurité de la mémoire de C combinée à toute la vitesse fulgurante de Smalltalk." Les historiens modernes soupçonnent que les deux étaient dyslexiques. ( source )
Mason Wheeler
4
Il tombe dans la gamme où les performances importent peu. C'est le seul langage pris en charge pour l'interfaçage avec Cocoa, donc si vous voulez le faire, rien d'autre ne fonctionne du tout. Pour toute autre chose, je le considérerais comme un choix terrible, quelles que soient les performances.
Jerry Coffin
1
La «performance» n'est pas une caractéristique d'une langue, mais d'une implémentation de langue et, plus important encore, des programmes écrits dans cette langue. Vous pouvez écrire des programmes très rapides dans Objective-C, ou vous pouvez écrire des programmes très lents.
Caleb
Il échoue à avoir une syntaxe hideuse mais ce n'est pas un mauvais langage basé sur ses compilateurs actuels car les performances sont plus basées sur le compilateur / vm que sur le langage réel.
Rig

Réponses:

28

Contrairement à C ++, Objective-C est conçu comme un sur-ensemble propre de C. Les quelques compilateurs Objective-C que j'ai utilisés sont mieux connus sous le nom de compilateurs C, mais gèrent également Objective-C.

Il est donc prudent de supposer qu'au niveau de la génération de code, C et Objective-C sont équivalents.

La première différence apparaît dans l'OOP ABI, également appelée «liaison de méthode tardive». Tout comme en C ++, Objective-C repose sur des tables de pointeurs de fonctions générées par le compilateur qui sont traversées au moment de l'exécution.

Contrairement à C ++, cependant, la méthode de liaison est plus «dynamique» et favorise l'utilisation de la idsuperclasse partout, ce qui la rend légèrement plus lente que C ++ en théorie. En pratique, cette différence est bien en dessous mesurable.

Enfin, le problème de performance le plus important est la qualité des bibliothèques utilisées. Comme Objective-C n'est vraiment populaire que dans les systèmes Apple, il est raisonnable de supposer que vous l'utilisez avec Cocoa; qui est un bel ensemble de bibliothèques de haut niveau. Dans la plupart des cas, vous pouvez leur laisser la lourde tâche, de sorte que votre code n'a pas besoin d'être aussi rapide, ou si vous effectuez des calculs intensifs, alors il est probable qu'il s'agisse d'une base de code principalement statique, à peu près similaire au C simple .

TL; DR: c'est là avec les langages C et C ++ où cela compte le plus. Si vous n'obtenez pas de bonnes performances, vérifiez vos algorithmes; comme dans n'importe quelle langue sérieuse.

Javier
la source
4
En fait, l'objectif-c moderne est à peu près aussi superficiel que le C ++ moderne. En C, vous êtes autorisé à faire de l'arithmétique sur des pointeurs arbitraires, vous ne pouvez pas en ObjC. La différence de performances due à la recherche de méthode est également mesurable: le chemin rapide d'objc_msgSend est environ quatre fois plus lourd qu'un appel de fonction membre (et les chemins lents ne sont pas aussi rapides que le chemin rapide).
11

Objective-C est plus lent que C / C ++. La raison en étant le temps d'exécution d'Objective-C qui distribue les recherches de méthodes dynamiquement au moment de l'exécution de la même manière que Smalltalk, à partir de laquelle il a repris ce modèle d'exécution. Envoie toutes les méthodes au moment de l'exécution est appelé «vrai message envoie» par opposition à l'appel de fonction en C / C ++ où l'adresse de la fonction est déterminée au moment de la compilation (sauf pour les méthodes virtuelles C ++). Mais je ne peux pas dire à quel point l'Objective-C est plus lent. ASAIK, il n'est utilisé que pour le développement d'applications en raison de la baisse des performances.

OlliP
la source
1
J'ai trouvé cette comparaison de performances avec C: rmarcus.info/?p=488 On dirait qu'Objective -C est néanmoins assez proche de C.
OlliP
Ce serait bien de comparer Objective C avec le reste du pack dans Benchmarks 'Game
Deer Hunter
Je pense que la comparaison des performances doit être prise avec un peu de sel car le code Objective-C est dans une certaine mesure du code C et non des messages Objecttive-C envoyés. Je ne sais pas à quoi sert la baisse. J'ai fait du développement Smalltalk pendant plus d'une décennie et Objective-C est basé sur Smalltalk à bien des égards. Je pense savoir de quoi je parlais.
OlliP
Pas le downvoter; Je suis principalement intéressé par les algorithmes fortement numériques, la répartition dynamique n'a pas beaucoup d' importance dans ceux-ci.
Deer Hunter
8

Réponse courte: il est compilé dans un format similaire à C / C ++ / D / Go / Rust. Il n'utilise pas un environnement virtuel comme Java / .Net. Et il n'est pas interprété comme Python / Ruby / Lua / JavaScript. C'est donc à l'extrémité la plus rapide du spectre.

Jacks_Gulch
la source
7

Les différences de vitesse fondamentales entre Obj-C et C / C ++, comme Oliver le dit ci-dessous, sont dues à la répartition dynamique des méthodes.

Cet article décrit cette surcharge dans Obj-C http://it.toolbox.com/blogs/macsploitation/bypassing-objectivecs-message-passing-mechanism-for-speed-24946

Il fournit également une très bonne astuce pour optimiser votre code Obj-C lorsque vous déterminez que la répartition de la méthode (c'est-à-dire objc_msgSend) est le facteur limitant - obtenez un pointeur vers la fonction une fois et utilisez-le pour appeler la fonction plusieurs fois. Cela ne devrait pas trop aider car les runtimes Obj-C font cette optimisation automatiquement .

Notez que le véritable coût de la répartition de méthode dynamique est dû aux échecs de cache, car il rompt la prédiction de branche CPU. Celles-ci sont difficiles à profiler et il se peut que le code cité ci-dessus ne mesure pas le véritable coût de manque de cache.

Une discussion plus utile est ici: http://www.cocoabuilder.com/archive/cocoa/106535-instance-variable-access.html#106605

Conclusion: les plus grandes différences entre les langues sont vos algorithmes. Au-delà de cela, il existe une différence de vitesse fondamentale entre Obj-C, C et C ++, en raison de la répartition dynamique ou virtuelle des méthodes. Ce deuxième point ne semble pas important. Et l'article ci-dessus donne une astuce pour l'optimiser, si vous pouvez trouver des points chauds via le profilage, ce qui peut être difficile en raison de manquements au cache du processeur.

MHH
la source