68 votes

Mon iPhone app prendre une performances si j'utilise Objective-C pour le code bas-niveau?

Lors de la programmation d'un CPU ou GPU intensive de l'application sur l'iPhone ou de tout autre matériel portable, vous avez à prendre de sages algorithmique des décisions à prendre votre code rapide.

Mais même les grands algorithme de choix peut être lente si la langue que vous utilisez effectue plus de mal qu'un autre.

Est-il dur des données de comparaison Objective-C, C++, en particulier sur l'iPhone, mais peut-être juste sur le bureau du Mac, pour l'exécution de nombreux autres aspects linguistiques? Je suis très familier avec cet article comparant C et Objective-C, mais c'est une question plus vaste de la comparaison de deux langages orientés objets les uns aux autres.

Par exemple, est un C++ vtable de recherche vraiment plus rapide qu'un Obj-C message? Comment beaucoup plus rapide? Le filetage, le polymorphisme, tri, etc. Avant de m'en aller sur une quête pour construire un projet avec copie de l'objet de modèles et de divers tests de code, je veux savoir si quelqu'un a déjà fait cela et ce que les résultats au cas où. Ce type de test et de comparaison est un projet en soi et peut prendre un temps considérable. Peut-être que ce n'est pas un projet, mais deux et seuls les résultats peuvent être comparés.

Je suis à la recherche de données en dur, pas de l'évangélisation. Comme beaucoup d'entre vous j'ai l'amour et la haine les deux langues, pour diverses raisons. En outre, si il ya quelqu'un là-bas activement dans ce même truc que j'aimerais être intéressant de tangage dans un peu de code pour voir le résultat final, et je suis sûr que d'autres l'aider trop. Ma conjecture est qu'ils ont des forces et des faiblesses, mon but est de savoir précisément ce qu'ils sont, de sorte qu'ils peuvent être évités/exploités dans des scénarios du monde réel.

58voto

Brad Larson Points 122629

Mike Ash a des chiffres pour l'exécution de divers Objective-C les appels de méthode par rapport à C et C++ dans son post "la comparaison des Performances des Opérations Communes". Aussi, ce post par la Savoie Logiciel est une lecture intéressante quand il s'agit de l'ajustement de la performance d'une application iPhone en Objective-C++.

J'ai tendance à préférer le nettoyage, le descriptif de la syntaxe de l'Objective-C Objective-C++, et n'ont pas trouvé le langage lui-même pour être la source de mon goulots d'étranglement des performances. J'ai même tendance à faire des choses que je sais le sacrifice d'un peu de performances si elles rendre mon code plus maintenable.

55voto

justin Points 72871

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 inlined. 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.

31voto

kotlinski Points 12815

Il est très difficile de recueillir des "données " dures" pour ce qui n'est pas trompeur.

Le plus gros problème avec une fonction de comparaison des fonctionnalités, comme vous le suggérez, c'est que les deux langues encourager les différents styles de codage. Objective-C est un langage dynamique avec le duck-typing, où typique C++ utilisation est statique. L'objet même de l'architecture orientée problème serait probablement très différentes solutions idéales à l'aide de C++ ou Objective-C.

Mon sentiment (que j'ai programmé beaucoup dans les deux langues, surtout sur de gros projets): Pour maximiser l'Objective-C de la performance, il doit être écrit très proche de C. Considérant que, le C++, il est possible de faire beaucoup plus d'utilisation de la langue, sans aucune perte de performance par rapport à C.

Lequel est le mieux? Je ne sais pas. Pour la performance pure, C++ aura toujours l'avantage. Mais la programmation orientée objet, le style de l'Objective-C a certainement ses mérites. Je pense vraiment qu'il est plus facile de garder un esprit sain de l'architecture.

7voto

Grant Peters Points 3718

Ce n'est vraiment pas quelque chose qui peut être répondu en général, car cela dépend vraiment de la façon dont vous utilisez les fonctionnalités de la langue. Les deux langues ont des choses qu'ils sont rapides à, les choses qu'ils sont lents, et les choses qui sont parfois rapide et parfois lent. Cela dépend vraiment de ce que vous utilisez et comment vous l'utilisez. La seule façon d'en être certain est de profil de votre code.

En Objective-C, vous pouvez aussi écrire du code c++, donc il pourrait être plus facile à coder en Objective-C pour la plupart, et si vous trouvez quelque chose qui ne fonctionne pas bien, alors vous pouvez avoir un aller à écrire une version c++ de elle et de voir si cela aide (C++ tend à mieux optimiser au moment de la compilation). Objective-C sera plus facile à utiliser si l'Api sont en contact avec sont également écrites, de plus, vous trouverez peut-être le style de la POO est plus facile et plus flexible.

En fin de compte, vous devez aller avec ce que vous savez que vous pouvez écrire coffre-fort, robuste code, et si vous trouvez une zone qui a besoin d'une attention particulière de l'autre langue, alors vous pouvez passer à l'. X-Code vous permet de compiler à la fois dans le même projet.

3voto

aalok Points 47

Je n'ai pas de données précises pour Objective-C, mais j'ai un bon endroit pour chercher du C++.

C++ a commencé comme C avec des Classes en fonction de Bjarne Stroustroup dans sa réflexion sur les premières années de C++ (http://www2.research.att.com/~bs/hopl2.pdf), C++ peut être considéré (comme Objectif C) appuyer sur C pour ses limites pour l'orientation de l'objet.

Quelles sont ces limites? Dans les années 1994-1997 laps de temps, un grand nombre de chercheurs a découvert que l'orientation de l'objet est venu à un coût due à la liaison dynamique, par exemple lorsque les fonctions C++ sont marqués virtuel et il peut/ne peut pas être des classes d'enfants qui remplacent ces fonctions. (En Java et C#, toutes les fonctions s'attendre à ctors sont intrinsèquement virtuel, et il n'y a pas beaucoup que vous pouvez faire à ce sujet.) Dans "Une Étude de Devirtualization Techniques pour un Java Just-In-Time compiler" de la part de chercheurs d'IBM de Recherche de Tokyo, ils contrastent les techniques utilisées pour y faire face, y compris une de Urz Hölzle et Gerald Aigner. Urz Hölzle, dans un document séparé avec Karel Driesen, a montré que, en moyenne, 5,7% de temps dans les programmes C++ (et jusqu'à ~50%) ont été dépensés en appelant des fonctions virtuelles (par exemple, vtables + thunks). Plus tard, il a travaillé avec quelques-uns de Smalltalk researachers en ce qui a fini par le Java HotSpot VM pour résoudre ces problèmes dans OO. Certaines de ces fonctionnalités sont réalignés pour C++ (par exemple "protégés" et la gestion des exceptions).

Comme je l'ai mentionné, C++ est statique tapé où l'Objectif C est de canard tapé. La différence de performance dans l'exécution (mais pas les lignes de code) est probablement une conséquence de cette différence.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X