Oui, bien écrit en C++ est beaucoup plus rapide. Si vous écrivez des critiques pour les performances des programmes et de votre C++ n'est pas aussi rapide que du C (ou dans un délai de quelques pour cent), quelque chose ne va pas. Si votre ObjC mise en œuvre est aussi rapide que le C, alors quelque chose est généralement mal -- à savoir le programme est susceptible d'être un mauvais exemple de ObjC des CRUES, car il utilise probablement une certaine "sale" des trucs à l'étape au-dessous de la couche d'abstraction de son fonctionnement dans le, tels que direct ivar accès.
Le Mike Ash 'comparaison' est très trompeuses, je ne recommanderais jamais à l'approche de comparer les temps d'exécution des programmes que vous avez écrit, ou le recommander à comparer C vs C++ vs ObjC. Les résultats présentés sont fournis à partir d'un test avec les optimisations du compilateur désactivé. Un programme compilé avec les optimisations handicapés est rarement pertinente lorsque vous êtes en mesure de temps d'exécution. À le considérer comme un point de repère qui compare C++ contre Objective-C est erronée. Le test compare également les caractéristiques individuelles, plutôt que de l'ensemble, le monde réel optimisé implémentations -- caractéristiques individuelles sont combinés de façons très différentes avec les deux langues. C'est loin d'être réaliste d'un critère de performance pour l'optimisation de la mise en œuvre. Exemples: Avec les optimisations activées, IMP
cache est aussi lent que la fonction virtuelle appels. Statique d'expédition (par opposition à la distribution dynamique, par exemple à l'aide de virtual
) et les appels à connus des types C++ (où la dynamique d'expédition peut être contourné) peut être optimisé de façon agressive. Ce processus est appelé devirtualization, et quand il est utilisé, une fonction membre qui est déclarée virtual
peut-être même inline
d. Dans le cas de Mike Cendres de test où de nombreux appels sont effectués à des fonctions de membre qui ont été déclarées en virtual
et ont des corps vides: ces appels sont optimisés à l'écart entièrement lorsque le type est connu parce que le compilateur voit la mise en œuvre et est en mesure de déterminer la distribution dynamique est inutile. Le compilateur peut également éliminer les appels à l' malloc
optimisé construit (favorisant la pile de stockage). Donc, permettant des optimisations du compilateur dans l'un quelconque de C, C++ ou Objective-C peut produire des différences spectaculaires dans le temps de l'exécution.
Cela ne veut pas dire que les résultats présentés sont tout à fait inutile. Vous pourriez obtenir quelques informations utiles sur les Api externes si vous souhaitez déterminer si il y a des différences mesurables entre le temps qu'ils passent en pthread_create
ou +[NSObject alloc]
sur une plate-forme ou de l'architecture par rapport à une autre. Bien sûr, ces deux exemples seront utilisation optimisée des implémentations dans vos tests (à moins que vous arrive d'être de leur développement). Mais pour la comparaison d'une langue à l'autre dans les programmes de la compilation... les résultats présentés sont inutiles avec les optimisations désactivé.
Création De L'Objet
Pensez également à la création d'objet en ObjC - chaque objet est alloué dynamiquement (par exemple sur le tas). Avec le C++, les objets peuvent être créés sur la pile (par exemple, environ aussi rapide que la création d'une structure C et appel d'une fonction simple, dans de nombreux cas), sur le tas, ou comme des éléments de types de données abstraite. Chaque fois que vous allouer et libérer (par exemple via malloc/free), vous pouvez introduire une serrure. Lorsque vous créez une structure C ou C++ objet sur la pile, pas de lock est nécessaire (bien que l'intérieur membres peuvent utiliser les allocations de tas) et il en coûte souvent un peu d'instructions ou de quelques instructions en plus d'un appel de fonction.
Ainsi, ObjC objets de référence sont comptés instances. Le besoin réel pour qu'un objet soit une std::shared_ptr
de critique pour les performances C++ est très rare. Il n'est pas nécessaire ou souhaitable en C++ pour faire de chaque instance partagée, référence compté instance. Vous avez beaucoup plus de contrôle sur la propriété et la durée de vie avec C++.
Les tableaux et les Collections
De tableaux et de nombreuses collections en C et C++ utilisent également fortement typé conteneurs et de mémoire contiguë. Depuis l'adresse de l'élément suivant à les membres sont souvent connus, l'optimiseur peut faire beaucoup plus, et vous avez beaucoup de mémoire cache et de la mémoire de la localité. Avec ObjC, c'est loin d'être une réalité pour les objets standard (par exemple, NSObject
).
Envoi
Concernant les méthodes, beaucoup de C++ implémentations utilisent quelques virtuel/dynamique des appels, en particulier dans hautement optimisé programmes. Ce sont des méthodes statiques et de fourrage pour les référenceurs.
Avec ObjC méthodes, chaque appel de méthode (objc d'envoi de messages) est dynamique, et est par conséquent un pare-feu pour que l'optimiseur. En fin de compte, que les résultats dans beaucoup de restrictions ou des inconvénients quant à ce que vous pouvez faire et ne pas faire pour garder des performances à un minimum lors de l'écriture critique pour les performances ObjC. Cela peut entraîner de grandes méthodes, IMP de la mise en cache, l'utilisation fréquente de C.
Certaines applications temps-réel ne peut pas utiliser toute ObjC de messagerie dans leur rendu les chemins d'accès. Aucun -- rendu audio est un bon exemple de cela. ObjC, l'expédition est tout simplement pas conçu pour en temps réel; les Allocations et les verrous peuvent se produire en arrière-plan lorsque des objets de messagerie, faisant de la complexité et de l'heure de objc de messagerie assez imprévisible que le rendu sonore peut manquer sa date d'échéance.
D'Autres Fonctionnalités
C++ fournit également des génériques/modèle d'implémentation de beaucoup de ses bibliothèques. Ces optimiser très bien. Ils sont typesafe, et beaucoup d'inlining et d'optimisation peut être faite à l'aide de modèles (tenir compte de ce polymorphisme, d'optimisation et de spécialisation qui a lieu à la compilation). C++ ajoute plusieurs fonctionnalités qui ne sont tout simplement pas disponibles ou comparables dans le strict ObjC. En essayant de comparer directement les langues, les objets et les bibliothèques qui sont très différentes n'est pas si utile, c'est un très petit sous-ensemble de réelles prises de conscience. Il est préférable d'élargir la question à une bibliothèque ou un cadre ou d'un programme réel, prise en compte de nombreux aspects de la conception et de la mise en œuvre.
D'Autres Points
Le C et le C++ symboles peut être retiré facilement et optimisé à l'écart dans les différentes étapes de la construction (décapage, l'élimination du code mort), d'inlining et au début de l'in-lining, ainsi que le Lien à l'Optimisation du Temps). Les avantages de cette comprennent la réduction de la taille du binaire, la réduction de lancement/temps de chargement réduit la consommation de mémoire, etc.. Pour une seule application, qui peut ne pas être une grosse affaire, mais si vous la réutilisation de code, et vous devriez, alors vos bibliothèques partagées pourrait ajouter beaucoup de poids inutile dans le programme, si mis en œuvre ObjC-sauf si vous êtes prêt à sauter à travers certains des cerceaux enflammés. Donc, l'évolutivité et la réutilisation sont également des facteurs de moyens/grands projets, et les groupes où la réutilisation est élevé.
Bibliothèques Incluses
ObjC bibliothèque des réalisateurs aussi optimiser pour l'environnement, ainsi que sa bibliothèque, les développeurs peuvent utiliser un langage et un environnement de fonctionnalités à offrir optimisé implémentations. Bien qu'il existe un nombre assez important de restrictions lors de l'écriture d'un programme optimisé dans le plus pur ObjC, certains hautement optimisé implémentations existent dans de Cacao. C'est l'un de Cacao points forts, bien que le C++ de la bibliothèque standard (ce que certains appellent le TSL) n'est pas en reste non plus. Le cacao s'opère à un niveau beaucoup plus élevé d'abstraction que C++ -- si vous ne savez pas bien ce que vous faites (ou devraient faire), d'exploitation plus près du métal peut réellement vous coûter. Tomber sur le dos pour une bonne mise en œuvre de bibliothèque si vous n'êtes pas un expert dans le domaine est une bonne chose, sauf si vous êtes vraiment prêt à apprendre. Ainsi, du Cacao environnements sont limitées, vous pouvez trouver des implémentations/optimisations qui en font un meilleur usage de le système d'exploitation.
Si vous êtes à la rédaction optimisée des programmes et de l'expérience de le faire en C++ et ObjC, propre C++ implémentations sera souvent deux fois plus vite ou plus vite que propre ObjC (oui, vous pouvez comparer le Cacao). Si vous savez comment l'optimiser, vous pouvez souvent faire de mieux que de niveau supérieur, les abstractions. Bien que, certains C++ optimisé implémentations d'être la plus rapide ou plus lent que du Cacao (par exemple, ma première tentative de fichier I/O a été plus lent que du Cacao -- principalement parce que le C++ mise en œuvre initialise sa mémoire).
Beaucoup de on en vient à la langue des fonctionnalités qui vous sont familiers. J'utilise les deux langues, ils ont des forces et des modèles/modèles. Ils se complètent assez bien, et il y a de grandes bibliothèques pour les deux. Si vous êtes à la mise en œuvre d'un complexe, critique pour les performances du programme, l'utilisation correcte de C++de fonctionnalités et bibliothèques vous donnera beaucoup plus de contrôle et de fournir des avantages importants pour l'optimisation, tels que dans les mains de la droite, "plusieurs fois plus rapide" est une bonne attente par défaut (ne pas s'attendre à gagner à chaque fois, ou sans travail, cependant). Rappelez-vous, il faut des années pour comprendre C++ assez bien pour vraiment y parvenir.
Je garde la plupart de mes critiques pour les performances des chemins de C++, mais également reconnaître que ObjC est également une très bonne solution pour certains problèmes, et qu'il existe quelques très bonnes bibliothèques disponibles.