CoreFoundation vs Fondation
En développement iPhone, la vitesse est de l'essence. Personne ne sait si il y a une différence de vitesse entre l'utilisation d'un CoreFoundation type (comme CFMutableDictionaryRef) par rapport à un type de Fondation (son homologue, NSMutableDictionary).
Je pense que la manipulation de la CF type serait plus rapide qu'il ne marche pas pour jeter autour ObjC exécution des messages, est-ce une hypothèse sans fondement, quelqu'un a effectivement regardé dans cette?
- Quand vous dites que la vitesse est de l'essence, voulez-vous dire de la vitesse de développement ou de la vitesse d'application?
- La vitesse dans l'application elle-même.
Vous devez vous connecter pour publier un commentaire.
Dans un sens technique du terme, oui, il est plus rapide, exactement pour cette raison.
Dans un sens pratique, non, c'est pas plus rapide. Pour une chose, la différence de vitesse est minuscule. Nous parlons de millisecondes enregistré sur la durée de vie de l'ensemble du processus.
Les économies qui pourraient être plus grand sur l'iPhone, mais il est encore assez bien le moindre gain de vitesse que vous pouvez obtenir. Votre temps est beaucoup mieux passé de profilage de votre application d'Instruments et d'aller où il vous dit et repassant les points chauds dans votre propre code.
Et c'est là que la Fondation devient plus rapide: Votre temps.
Code qui utilise de la Fondation autorelease fonction chaque fois que possible, vous permet d'économiser beaucoup de temps et des maux de tête en évitant facilement les inévitables fuites de mémoire (à savoir, en oubliant d'écrire ou de ne pas atteindre
release
messages). FC n'ont pas autorelease, de sorte que vous devez vous rappeler explicitementCFRelease
tout ce que vous créez ou copiez—et quand vous oubliez ou ne parviennent pas à atteindre ce code (et je ne veux dire quand—je parle d'expérience), vous passerez beaucoup plus de temps de la chasse à la fuite de mémoire. L'analyseur statique aide, mais il ne sera jamais en mesure de rattraper le tout.(Vous techniquement peut autorelease CF les objets, mais le code pour le faire est terriblement laid et que vous êtes seul à l'arrosage en bas de votre déjà minuscule, un gain de vitesse.)
Donc, s'en tenir à la Fondation autant que possible. N'exagérez pas avec le autorelease; même dans le plus pur Cacao, il y a encore des moments où explicitement libérant des objets est justifiée (surtout des boucles serrées), et cela va double pour Cocoa Touch (depuis iOS va tuer votre application si vous allouer trop de mémoire, de sorte que vous aurez envie de la libération de gros objets comme des images dès que possible). Mais généralement, autorelease vous permet d'économiser beaucoup plus de temps que les FC ne sera jamais enregistrer vos utilisateurs.
Le non-temps raison en est que le code Objective-C, avec les noms d'argument (à partir du message sélecteur) mélangé avec des valeurs, est beaucoup plus facile à lire que C basée sur la fonction de code. Cela peut ne pas faire votre travail plus rapidement, mais il est certainement plus amusant.
NSMutableDictionary
est une classe de cluster qui, souvent, retourne un objet dont la classe estNSCFDictionary
, qui est fondamentalement juste un ObjC classe qui utilise un CFDictionary que son magasin de sauvegarde.)objc_msgSend
et de ses frères et sœurs) ne sera pas plus cher que le profil de la montre. Et si elle l'est, cela signifie généralement que vous êtes l'envoi d'un nombre excessif de messages en premier lieu, et de faire un nombre excessif d'appels de fonction au lieu de cela ne résoudra pas votre problème réel.L'écriture de code CF fonctions sera en effet apporter un gain de performances de votre application, cependant il y a une autre meilleure approche pour l'amélioration de la performance: l'écriture directement en assemblée apporter encore plus d'avantages de performance (bien que ce soit une approche extrême).
Langage de haut niveau des constructions est préférable à un faible niveau pour au moins les raisons de Peter Hosey mentionné. À cela on peut ajouter l'optimisation prématurée qui peut facilement conduire à l'échec du projet, le développeur est plus préoccupé par la non-aspects fonctionnels de l'application au lieu de l'fonctionnels.
Si, après vous avez une application entièrement fonctionnelle, vous pensez que certaines parties du code ont goulots d'étranglement des performances, vous pouvez essayer d'optimiser ceux qui, par la réécriture de leur langage de bas niveau des constructions. Vous aurez au moins avoir un point de comparaison avec le code actuel, assurez-vous que le faible niveau de code se comporte comme prévu (qu'il soit manuel ou des tests unitaires fera l'affaire ici).