2010-05-11 1 views
1

J'ai écrit une application qui a un certain nombre de vues personnalisées et dessine généralement beaucoup de lignes et de bitmaps. Puisque les performances sont quelque peu critiques pour l'application, j'ai passé beaucoup de temps à optimiser les performances de tirage. Maintenant, le moniteur d'activité m'indique que mon application utilise habituellement environ 12% CPU et Instrument (le profileur) dit qu'un CPU de 10% est dépensé en objc_msgSend (principalement dans les appels système liés au dessin). D'un côté, je suis content car cela signifie que mon dessin est à peu près aussi rapide que possible et mes optimisations ont été un énorme succès. D'un autre côté, il semble impliquer que la seule chose qui utilise encore mon processeur est le surcoût Objective-C pour les messages (objc_msgSend). Par conséquent, si j'avais écrit l'application dans Carbon, par exemple, sa performance serait considérablement meilleure. Maintenant, je suis tenté de conclure que Objective-C est un langage avec de mauvaises performances, même si Cocoa semble être terriblement efficace car il peut apparemment dessiner plus vite que Objective-C peut envoyer des messages.Mon programme passe la plupart de son temps dans objc_msgSend. Est-ce que cela signifie que Objective-C a de mauvaises performances?

Alors, Objective-C est-il vraiment un langage avec de mauvaises performances? Qu'est ce que tu penses de ça?

+2

Il n'est pas nécessaire que ce soit un wiki communautaire ... –

+3

Je pense que "10% dans' objc_msgSend' "signifie" 10% du temps passé par le programme ". Si le programme ne dépense que 12% du CPU total, 'objc_msgSend' dépense 1% du temps CPU total. – Yuji

Répondre

9

Non, les performances d'Objective-C ne sont pas si mauvaises. Pour preuve, je cite @ série de bbum d'articles sur l'assemblage optimisé à la main de objc_msgSend:

  1. The Roadmap
  2. Setting the Stage
  3. The Fast Path
  4. Method Lookup and some odds and ends

En d'autres termes, objc_msgSend est vite; méthode d'expédition n'est pas votre problème. Pouvez-vous publier vos informations de profilage qui vous amènent à croire le contraire? Il est possible que vous fassiez une mauvaise interprétation de l'analyse, ou que vous fassiez quelque chose de vraiment étrange sous les couvertures, etc.

Mais je vous garantis que objc_msgSend n'est pas le problème. Si c'était le cas, nous en aurions sûrement entendu parler maintenant. :)

+0

Cela ne me surprendrait pas du tout si le programme passait 10% de son temps dans obj_msg_send. J'ai vu des pourcentages beaucoup plus élevés. J'ai écrit un émulateur 6502 en Objective C et je voyais du temps dans obj_msg_send de l'ordre de 20% ou plus.Par rapport à un appel de fonction C, obj_msg_send est cher, mais d'un autre coté, même mon émulateur 6502 en C pur ne gagnerait que 20%. En fait, j'ai pu gagner beaucoup avec de simples optimisations évidentes comme: 'pour (i = 0; i <[nombre de tableaux]; ++ i)' => 'size_t arrayCount = [nombre de tableaux]; Pour (i = 0; i JeremyP

2

Dans quel sens regardez-vous l'arbre d'appel (voir la case à cocher "Inverser l'arbre d'appel")?

Si la pile d'appels est inversée, avez-vous foré la commande dans objc_msgSend pour voir où le temps est passé? Le "Temps d'exécution%" qui s'affiche par défaut (cntrl-clic pour changer) signifie "pourcentage de temps où votre code était occupé" - par ex. Si vous exécutez une méthode rapide courte et puis pendant 10 heures le temps de pourcentage pour votre méthode, et donc pour objc_msgSend parce que c'est la méthode qui a appelé votre méthode - serait% 100 - Cela ne signifie pas que objc_msgSend est lent.

+0

Comme je l'ai dit, le temps est principalement consacré au dessin des appels associés, mais cela signifie que la vitesse de dessin est principalement limitée par objc_msgSend, n'est-ce pas? – bastibe

+1

Dites, vous voyez 'objc_msgSend 10%' et vous y voyez un peu plus loin et vous voyez à l'intérieur objc_msgSend '-init 3,33%', '-drawRect 3,33%', 'dealloc 3,33%' c'est votre 10% juste là, pris par vos méthodes, donc la surcharge de l'objc_msgSend était nulle (en réalité proche de zéro) .Le fait que vous utilisez 12% du CPU signifie que vous êtes au ralenti pendant 88% du temps (si vous avez 1 core, 188% si vous avez 2 cœurs, etc.) vous n'êtes donc pas du tout limité - vous n'arrivez pas à utiliser les ressources CPU disponibles – hooleyhoop

+0

Pourriez-vous poster le rapport d'Instruments quelque part afin que nous puissions – Yuji

Questions connexes