J'essaie de déterminer quand il est plus efficace de La documentation pour Array.Resize dit qu'il effectue une copie de l'ensemble de la matrice et la place dans un nouvel objet. L'ancien objet devrait être jeté. Où réside cet ancien objet? Sur la pile ou le tas? p>
Je ne sais pas comment list.add () fonctionne. P>
Est-ce que quelqu'un sait comment la méthode List.Ajoud se compare à la méthode Static Array.Resize? p>
Je suis intéressé par l'utilisation de la mémoire (et le nettoyage) et ce qui est meilleur pour 300 types de valeur, contre 20 000 types de valeur. P>
Pour ce que ça vaut la peine, je prévois d'exécuter ce code sur l'une des saveurs intégrées de .NET. Potentiellement le .NET gadgeteer p> Liste
Array.Resize () P>
5 Réponses :
Vous devez utiliser une liste Utilisation de A
Array.Resize Code> vous forcera à développer le tableau séparément chaque fois que vous ajoutez un élément, ce qui rend votre code beaucoup em> plus lent. (Étant donné que les matrices ne peuvent pas avoir de capacité de rechange) p>
Liste
Tout ce qu'il faut faire pour ajouter un élément consiste à définir un élément dans la matrice et à augmenter sa taille interne code> compteur.
Lorsque la matrice est remplie, la liste doublera sa capacité, ce qui permettra d'ajouter des articles à venir à nouveau sans effort. P>
Je suis curieux de savoir ce qui est le meilleur pour 300 objets puisque MSDN dit que la liste
En plus, je créerai de nombreux magasins de 300 objets, et donc comprendre cette optimisation peut être bénéfique, et pas seulement universitaire.
C'est par rapport à ArrayList code>, qui doit être évité à tout prix (puisqu'il est non générique et nécessite des moulages et de la boxe). En outre, les 500 articles n'ont pas besoin d'être dans une liste. Si vous avez deux listes, cela paiera toujours.
Si vous savez exactement combien d'articles vous aurez besoin, vous pouvez définir la capacité de la liste code> dans le constructeur. De cette façon, vous n'aurez plus besoin de redimensionner. Sa performance sera alors complètement équivalente à un tableau.
Lorsque la liste
Il copie la matrice; L'ancienne copie est collectée par le GC.
@Slaks examinant cette référence que A pour sur un tableau est 5 fois plus efficace qu'une liste sur une liste
@Jeremythompson: essayez pour code> sur la liste
toarray () code>.
Le micro-cadre .NET ne prend pas en charge les génériques. Je vais donc utiliser un tableau, la copie et la destruction si nécessaire. P>
Je peux comparer cette perfmance à la liste liée déroulée mentionnée dans la bibliothèque PowerTools ici: Toute mise en œuvre d'une liste liée déroulée en C #? p>
Le micro-cadre .NET ne supporte pas (encore) les génériques de soutien. Vous êtes limité en ce qui concerne les collections dynamiques. P>
Une chose à considérer lors de la sélection de votre approche est que le code géré sur le microcontrôleur est très très lent. De nombreuses opérations dans les objets gérés .NET Micro Framework s'appellent en réalité dans un code natif pour faire le travail. C'est beaucoup plus rapide. P>
Par exemple, comparez la copie d'un élément de tableau par élément dans A pour boucle par rapport à la matrice d'appel. Copy () qui fait essentiellement la même chose mais dans le code natif. P>
Si possible, utilisez ces extensions natives pour obtenir une meilleure performance. Envisagez également de jeter un coup d'oeil au Projet Microlinq sur CodePlex. Il existe un sous-projet consacré à des collections améliorées sur NetMF (également disponible en tant que Package Nuget ). Le code est librement disponible et classé ouvertement sous licence à tout moment. (Divulgation complète: Je suis le dev de ce projet.) P>
Si vous pouvez vous échapper avec un grand tableau et garder une trace de la position Max à laquelle des données réelles ont été enregistrées, ce serait le plus rapide mais nécessite davantage de travail / pensée mises dans la conception et enlève du temps de construction de la construction de Stuff cool. p>
liste ne sera plus rapide que si vous redimensionnez le tableau fréquemment, par exemple chaque fois que vous ajoutez un élément. Toutefois, si vous le redimensionnez tous les deux cadres, la liste et les tableaux intégrés doivent être équivalents, peut-être des matrices encore plus rapides. P>
J'ai vu la mise en œuvre de la liste après la décompilation et a constaté qu'il utilise Array.Resize () pour une matrice interne. Mais il gère les éléments compteur d'éléments et utilise la longueur de la matrice en tant que capacité et redimensionne la matrice avec un espace supplémentaire lorsque vous appelez Ajouter (). Donc, je suppose que vous pouvez développer une stratégie d'allocation plus optimale que la liste de votre cas. Mais vous devrez gérer manuellement les éléments d'éléments. Vous allez également vous débarrasser de la surcharge des indexeurs lors de l'accès à des éléments de tableau, car les indexateurs à l'intérieur de la liste ne sont que des méthodes qui demandent des éléments de réseau internes. Je pense que cela vaut la peine de remplacer la liste par matry avec le redimensionnement manuel s'il s'agit d'un goulot d'étranglement. P>
Il n'y a pas de problèmes de boxe. Ne pas réinventer la roue.
liste code> existe pour une raison; utilise le!
J'ai eu une liste de sentiments était la réponse de quelque chose de plus de 500 objets, mais je suis curieux après avoir lu ceci (recherche de 500) msdn.microsoft.com/en-us/library/6sh2ey19.aspx
Y a-t-il des problèmes de boxe avec System.Array?
Non, il n'y en a pas. La boxe n'est qu'un problème avec des collections non génériques.
Cette ligne (environ 500) parle de la taille du bytecode générique. Ne t'inquiète pas pour ça. La performance (boxe / copie) est plus importante que l'utilisation de la mémoire (au moins à cette échelle)
Vous vous inquiétez probablement des choses que vous n'avez pas besoin de vous inquiéter. Sauf si vous avez un problème d'utilisation Si vous avez une idée assez bonne idée du nombre d'articles que votre liste vous détiendra généralement peut utiliser le paramètre de capacité. Si vous avez des problèmes de performance - vous pouvez probablement faire de meilleurs correctifs que cela dans votre code.
@ Makerofthings7 Les matrices sont des "types de référence" - peu importe le type de la cellule. Ils ont un support sous-jacent qui n'est exposé que par les opérateurs d'accès. La conception que "types de valeur" sur la pile est en grande partie erronée, ne s'applique que dans certains cas (par exemple, des variables et / ou des arguments de méthode typées locales), et constitue une caractéristique / détail de mise en œuvre.