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?
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?
Réponses:
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 id
superclasse 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.
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.
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.
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.