lorsque je regarde le code que gnustep fourni, je peux obtenir ce et ArraywithCapacité code> est une méthode définie dans arrayanwithpapacity est une méthode normale qui appelle initwithcapacité code>: p> initwithcapacité code> est une méthode simple qui ne fait que soi Initialisation. P> - (id) initWithCapacity: (NSUInteger)numItems
{
self = [self init];
return self;
}
3 Réponses :
Les méthodes font réellement partie de 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 N'oubliez pas que c'est Juste un indice et une implémentation peut l'ignorer. En fait, selon nsmutableArray code>, pas nsarray code>. nsmutableArray code> peut allouer la quantité de mémoire requise en une fois. P> cfarray / cfmutableArray code> a> fait em> ignore la capacité lors de la création d'une matrice mutable em>: p> lié par @azsromej, nsmutableArraRay code> semble aussi ignorer l'indice. p> p>
Ceci s'applique à Il existe un avantage négligeable si tout avantage d'utiliser 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. P>
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. P>
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. p>
Voir aussi ridicule pour plus d'informations sur 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. " p> nsmutableArray code> car nsarray code> n'a pas la méthode TaryWithCapacity code>, ceci s'applique également à initwithcapacité code>: p>
TarywithCapacité code> à partir d'un POV d'exécution. Il peut être considéré comme une optimisation prématurée. P>
nsarray code>. p>
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 i> au test de performance! Et bien sûr, la différence dépendrait du nombre d'éléments.
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). P>
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.
Votre source n'est pas correcte. Étant donné que
nsarray code> est un objet immuable, il n'a pasinitwithcapacité: code> méthode.@Desdenova: En réalité, la source est correcte: ces fichiers contiennent les deux
nsarray code> et i>nsmutableArray code> 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: code> ne contient que[auto init] code>. 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: code> surnsmutableArraRay code>, car il est censé être. Considérez également que la capacité est une indice i>: une implémentation peut l'ignorer. Quel gnoudep fait-il.@Desdenova: Aussi, CFMutableArrayCreate fait I> Ignorer la capacité. Et selon le Article lié à AzSromej Réponse, on dirait que le La même chose est vraie pour
nsmutableArray code> (sans surprenant à la lumière decfmutableArraycreate code>).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.