2010-06-02 6 views
0

Je tente de reconstituer et d'exécuter une liste de tâches mises en place par un utilisateur. Ces listes de tâches peuvent contenir des centaines ou des milliers d'éléments.Combien de frais généraux un appel msg_send doit-il supporter?

D'après ce que je sais, la façon la plus simple et la plus évidente serait de construire un tableau et itérer puis à travers eux:

NSArray *arrayOfTasks = .... init and fill with thousands of tasks 

for (id *eachTask in arrayOfTasks) 
{ 
    if (eachTask && [eachTask respondsToSelector:@selector(execute)]) [eachTask execute]; 
} 

Pour un ordinateur de bureau, cela peut être pas de problème, mais pour un iphone ou ipad , cela peut être un problème. Est-ce une bonne façon de procéder, ou existe-t-il un moyen plus rapide d'accomplir la même chose?

La raison pour laquelle je demande à quel point un msg_send survient est que je pourrais également faire une implémentation C directe. Par exemple, je pourrais créer une liste chaînée et utiliser un bloc pour gérer la tâche suivante. Vais-je gagner quelque chose ou est-ce vraiment plus de problèmes que de valeur?

+1

Vous n'avez pas besoin de vérifier si 'eachTask' est non-nul. 'respondsToSelector:' aboutira à NO si 'eachTask' est nul ou ne répond pas' execute'. – dreamlax

+2

De toute façon, vous n'obtiendrez pas la valeur 'nil' d'un NSArray. – kperryua

+2

'id *' est faux ici – newacct

Répondre

6

Je suppose que vous parlez de objc_msgSend, auquel cas, Bill Bumgarner a un excellent 4 Part Series qui vaut la peine d'être lu.

En général, je recommanderais simplement d'utiliser Obj-C. C'est ce que toutes les applications pour les iDevices utilisent, y compris Apple, et des centaines d'éléments ne vont pas tuer l'appareil.

+0

+1 bel article – shosti

+0

merci! excellent article! – pxl

+0

juste un addendum à mon commentaire ... j'aime aller au fond des choses, et la documentation d'Apple ne va que très loin ... donc c'est vraiment un super article! – pxl

0

Qu'est-ce que rynmrtn a dit ...

À moins que vos -execute méthodes étaient excessivement simpliste - incrémenter/tester une petite poignée de valeurs scalaires - alors il est peu probable que objc_msgSend() va même apparaître comme un% de votre programme de Temps CPU.

Mesurer d'abord, optimiser après.

Votre code soulève une question; pourquoi mettez-vous des choses dans le arrayOfTasks qui pourrait ne pas être en mesure de execute. En supposant que tout dans votre arrayOfTasks est une sous-classe de votre création, vous pouvez ajouter une méthode execute et ne pas faire le répond test. Si vous avez une hiérarchie de classes de collection, vous pouvez utiliser des catégories pour ajouter les méthodes - il suffit de mettre un préfixe sur 'em pour être sûr (c'est-à-dire pxl_execute ou quelque chose comme ça).

+0

Je devrais probablement avoir utilisé le pseudo code, mais l'idée est de passer par une liste de milliers d'objets et d'appeler une méthode pour chacun d'eux – pxl

0

Here est une belle comparaison de référence des opérations courantes, y compris objc_msgSend. En général, vous ne devriez pas vous soucier de la performance objc_msgSend, même sur l'iPhone. L'envoi de message sera toujours plus lent qu'un appel de fonction C direct, mais sur un processeur moderne (rappelez-vous, le processeur de l'iPhone est toujours d'environ 500 mhz), la différence est triviale la plupart du temps. Si le profilage montre que beaucoup de temps est utilisé dans objc_msgSend, alors il peut être utile d'utiliser des fonctions C droites plutôt que des méthodes Objective-C. Pour plus de clarté, vous pouvez utiliser -[NSArray makeObjectsPerformSelector:] ou (sur Mac) enumerateObjectsUsingBlock: au lieu de parcourir les objets, mais je ne pense pas que cela devrait faire beaucoup de différence de performance.

+0

merci! à partir des commentaires et de ce que je lis moi-même, je ne devrais vraiment pas m'inquiéter du tout au sujet d'objc_msgSend, et juste sortir quelque chose qui fonctionne. Ensuite, comme vous le suggérez, lancez des tests de performance et commencez à trouver où se trouvent tous les goulots d'étranglement et les points lents. – pxl

Questions connexes