7
votes

Quel est l'avantage d'utiliser la gammeWithCapacité

ArraywithCapacité code> est une méthode définie dans nsarray.h strong> et implémenté dans nsarray.m strong>

lorsque je regarde le code que gnustep fourni, je peux obtenir ce arrayanwithpapacity est une méthode normale qui appelle initwithcapacité code>: p> xxx pré>

et initwithcapacité code> est une méthode simple qui ne fait que soi Initialisation. P>

- (id) initWithCapacity: (NSUInteger)numItems
{
  self = [self init];
  return self;
}


7 commentaires

Votre source n'est pas correcte. Étant donné que nsarray est un objet immuable, il n'a pas initwithcapacité: méthode.


@Desdenova: En réalité, la source est correcte: ces fichiers contiennent les deux nsarray et nsmutableArray qui est là où vous trouverez les deux méthodes.


@Darkdust Que ce soit sous forme de matrice mutable ou de matrice, je pense à peine que initwithcapacity: ne contient que [auto init] . Entre la documentation officielle et une documentation open source, j'irais avec l'officiel.


@Desdenova: Bien sûr, surtout, car il peut passer de la version à la version, mais cela ne rend pas la mise en œuvre de Gnustep. Il n'a que initwithcapacity: sur nsmutableArraRay , car il est censé être. Considérez également que la capacité est une indice : une implémentation peut l'ignorer. Quel gnoudep fait-il.


@Desdenova: Aussi, CFMutableArrayCreate fait Ignorer la capacité. Et selon le Article lié ​​à AzSromej Réponse, on dirait que le La même chose est vraie pour nsmutableArray (sans surprenant à la lumière de cfmutableArraycreate ).


C'est défini dans Nsarray.h, mais dans l'interface Nsmutablearray (NsmutableArrayRayRayCreation). Tu peux le vérifier.


Jetez un coup d'oeil à Gnustep's Gsarray.m. La mise en œuvre de Gnustep n'ignore pas le capuchon donné. Lorsque vous allouez la matrice, vous obtenez une sous-classe non nsmutableArray elle-même. Vérifiez également le commentaire ci-dessus -4IntwithPapacité: vous avez copié comme cela explique tout cela.


3 Réponses :


2
votes

Les méthodes font réellement partie de nsmutableArray , pas nsarray .

Il donne la mise en œuvre un indice sur le nombre d'articles que vous aimez stocker afin qu'il puisse déjà allouer Assez de mémoire en haut au lieu de la croissance de la mémoire selon les besoins, ce qui peut être coûteux car il pourrait s'agir d'allouer, copier de l'ancienne mémoire à la nouvelle, annoncez l'ancienne mémoire. Et si vous ajoutez beaucoup d'articles, cette croissance pourrait arriver beaucoup, il est donc plus efficace si le nsmutableArray peut allouer la quantité de mémoire requise en une fois.

N'oubliez pas que c'est Juste un indice et une implémentation peut l'ignorer. En fait, cfarray / cfmutableArray fait ignore la capacité lors de la création d'une matrice mutable : xxx

selon Cet article lié ​​par @azsromej, nsmutableArraRay semble aussi ignorer l'indice.


0 commentaires

1
votes

Ceci s'applique à nsmutableArray car nsarray n'a pas la méthode TaryWithCapacity , ceci s'applique également à initwithcapacité :

Il existe un avantage négligeable si tout avantage d'utiliser TarywithCapacité à partir d'un POV d'exécution. Il peut être considéré comme une optimisation prématurée.

Il a un désavantage ou une prise de temps et / ou de code pour proposer une valeur qui fournit très rarement un avantage de temps significatif et augmente la charge mentale.

Il est également considéré comme un indice et peut ou non être utilisé, c'est-à-dire un détail de mise en œuvre Apple peut changer à des tine.

Remarque: j'ai fait des tests de synchronisation avec et sans l'indice de capacité et le temps sauvé, le cas échéant, était un pourcentage extrêmement faible.

Voir aussi ridicule pour plus d'informations sur nsarray .

Commentaire de @bbum: "Les Docs Simple State établissent la capacité initiale non que la matrice a alloué la mémoire pour contenir toutes ces capacités. Le magasin de support de tableau n'est pas des morceaux de mémoire alloués linéairement et les détails changent avec la taille de la taille de la mémoire. tableau. "


2 commentaires

Il est très difficile de tester les implications de la performance de ces composants de niveau bas. La performance de chacune de ces méthodes peut varier sur la base d'innombrables facteurs, tels que le nombre d'éléments dans la matrice, l'itération parallèle, le remplacement de l'article, l'allocation de réseau, la libération de la matrice, etc. Je recommande de rechercher un test approfondi ou une déclaration officielle de pomme.


@Mabedan: C'est Trivial au test de performance! Et bien sûr, la différence dépendrait du nombre d'éléments.



9
votes

L'attente est que la fourniture d'une taille explicite améliore l'allocation de la mémoire, car il n'est pas nécessaire d'ajuster la taille de la matrice comme des éléments sont ajoutés. En pratique, il s'agit juste d'un indice et il y a quelques preuves que ce n'est pas réellement utilisé (voir cette Article Objc.io sur les classes de collecte de la Fondation).


1 commentaires

Nous terminons donc cela, les résultats des tests montrent qu'il n'y a pas de différence de performance. L'utilisation principale de la méthode de TaryWithCapacité est d'être un «indice». Pour rendre le code plus lisible, afficher le programmeur de l'importance de l'article de la matrice.