2010-03-24 5 views
4

J'ai une méthode qui doit fonctionner dans son propre fil 88 fois par seconde (c'est un rappel pour une unité audio.) Dois-je éviter de créer un NSAutoreleasePool chaque fois qu'il est appelé?Quel est le coût pour créer un NSAutoreleasePool

+1

Je viens tout juste de revenir de requin. [NSAutoReleasPool] utilise 0,2% de mon processeur, il ressemble à. Je peux me permettre cela, je vais le laisser là. – morgancodes

Répondre

2

Si vous pouvez l'éviter, faites-le. Si vous ne pouvez pas, il n'y a pas besoin de s'inquiéter à ce sujet, les pools autorelease sont créés et libérés assez rapidement. Si vous avez besoin d'une réponse précise, mettez en place un test et une mesure simples (ce qui est toujours une bonne idée lorsque vous parlez de performance).

+0

Merci pour le deuxième rappel aujourd'hui que les expériences sont la meilleure façon d'apprendre sur la performance zoul :) – morgancodes

5

Création du NSAutoreleasePool lui-même ne devrait pas être trop lent, mais s'il y a beaucoup d'objets à dealloc'ed lorsque vous « fuite » de la piscine, qui pourrait commencer à obtenir lent. Cela vaut sans doute la peine de déterminer le temps que prennent les drains de la piscine.

3

S'il vous plaît voir Mike Ash de Performance Comparisons of Common Operations. Quand il a testé en 10.5, créer et détruire un pool autorelease a pris 0,0003577 millisecondes.

+1

Plus pertinent pourrait être ses repères iPhone (compte tenu de l'étiquette sur la question): http://www.mikeash.com/pyblog/performance -comparaisons-de-common-operations-iphone-edition.html où la même opération prend 0.0173 ms. Dans tous les cas, des tests expérimentaux pour équilibrer les performances sont généralement nécessaires dans des situations comme celle-ci. –

4

En supposant que vous venez de retour d'instruments ou de requin avec des preuves concrètes que AutoRelease piscines sont vraiment un problème de performance dans votre application ...

Créer vos propres piscines autorelease est une réponse à un dilemme. Vous le faites lorsque vous créez beaucoup d'objets, afin de ne pas en créer trop en même temps et d'entrer dans l'enfer de pagination (sur le Mac) ou d'obtenir un avertissement de mémoire et/ou de résiliation (iPhone OS).

Mais autorelease piscines sont des objets aussi. Ils ne sont pas gratuits. Le coût d'un seul pool d'autorelease est minime, mais dans une boucle où vous créez beaucoup d'objets, vous créez probablement un pool tous les objets X, le vidange et en créez un autre pour les prochains objets X.

Même alors, les piscines autorelease ne sont probablement pas que beaucoup et ne sera donc pas ajouter grand-chose. Vous devriez le voir dans votre profil Instruments ou Shark: la majeure partie du temps passé en -[NSAutoreleasePool drain] est passée à -[NSObject release]. C'est le temps que vous allez passer si vous utilisez un pool autorelease ou non. Depuis décembre 2011, les pools autorelease peuvent maintenant être créés sans objet, avec l'instruction @autoreleasepool. Ils sont sans doute pas encore libre (au moins sans ARC), mais maintenant, ils sont encore moins chers qu'auparavant.]

Ainsi, la vraie solution dans ce cas est simplement de créer moins d'objets. Cela peut signifier:

  • En utilisant et en réutilisant des tampons autant que possible, reallocating un tampon précédemment utilisé lorsque la taille nécessaire change. Vous pouvez utiliser the malloc_good_size function pour arrondir la taille, afin de réduire le risque de réallocation (vous pouvez passer la réaffectation si l'ancienne taille requise et la nouvelle taille requise sont arrondies au même nombre). Vous pouvez également envisager de ne faire que grossir le tampon, sans jamais le rétrécir.
  • Utilisation et réutilisation d'objets mutables. Par exemple, si vous créez une chaîne puis l'écrivez dans un document, au lieu de la libérer et d'en créer une nouvelle, supprimez tout son contenu ou remplacez l'ancien contenu par la première partie de la "nouvelle" chaîne.
  • Ajustement de la valeur de X (votre seuil d'élimination de pool). Un X plus élevé signifie plus de consommation de mémoire momentanée, mais moins de pools créés et jetés. Lower X signifie plus de pools, mais moins de risque de pagination ou d'avertissement de mémoire. Il est peu probable que cela fasse une grande différence, sauf si vous augmentez trop X ou si vous le réduisez à un niveau trop élevé.
+0

Merci Peter. Il s'avère que, dans mon cas, le coup de performance de - [NSAutoreleasePool drain] s'avère être négligeable, mais c'est une bonne information à avoir pour référence future. – morgancodes

Questions connexes