Question

Je suis en train de déterminer quand il est plus efficace de List<T>.Add() par rapport à l'aide de la méthode de Array.Resize().

La documentation Array.Resize dit qu'il fait une copie de l'ensemble du réseau, et il place dans un nouvel objet. L'ancien objet devrait être mis au rebut. D'où vient ce vieux résident de l'objet? Sur la pile ou le tas?

Je ne sais pas comment List.Add () fonctionne.

Quelqu'un sait comment la méthode List.Add compare la méthode de Array.Resize statique?

Je suis intéressé par l'utilisation de la mémoire (et le nettoyage), et ce qui est mieux pour 300 types de valeur, par rapport à 20 000 types de valeur.

Pour ce que ça vaut, je prévois d'exécuter ce code sur l'une des saveurs intégrées de .NET. Potentiellement, le .NET Gadgeteer

Était-ce utile?

La solution

Vous devez utiliser un List<T>.

Utilisation Array.Resize vous forcer à étendre le tableau séparément chaque fois que vous ajoutez un élément, ce qui rend votre code beaucoup plus lent. (Puisque les tableaux ne peuvent pas avoir la capacité de réserve)

A List<T> est soutenu par un tableau, mais détient une capacité de réserve pour mettre les articles en.
Tout ce qu'il doit faire pour ajouter un élément est de définir un élément du tableau et d'augmenter son compteur size interne.
Lorsque le tableau est plein, la liste va doubler sa capacité, ce qui permet de futurs articles à ajouter sans effort à nouveau.

Autres conseils

Le .NET Micro Framework ne prend pas en charge les médicaments génériques, donc je vais utiliser un tableau, la copie et la destruction au besoin.

Je pourrais comparer ce perfmance à la liste chaînée mentionné dans la déroulée bibliothèque PowerTools ici: Toute mise en œuvre d'une liste chaînée Déroulé en C #?

Le .NET Micro Framework n'a pas (encore) génériques de soutien. Vous êtes limité en ce qui concerne les collections de dynamiques.

Une chose à considérer lors de la cueillette de votre approche est que le code managé sur le microcontrôleur est très, très lent. De nombreuses opérations dans les objets gérés .NET Micro Framework sont en fait simplement appeler en code natif pour faire le travail. Cela est beaucoup plus rapide.

Par exemple, la copie d'un élément comparer tableau par élément dans une boucle par rapport à l'appel Array.Copy () qui fait essentiellement la même chose, mais dans le code natif.

Si possible, utiliser ces extensions natives pour obtenir de meilleures performances. Voir également jeter un oeil sur le projet MicroLinq sur CodePlex. Il y a un sous-projet consacré seulement aux collections améliorées NETMF (également disponible en package NuGet ). Le code est disponible gratuitement et sous licence libre à toute fin. (Divulgation complète:. Je suis le dev de ce projet)

Si vous pouvez vous contenter de l'allocation d'un large éventail et de garder une trace de la position max à laquelle des données réelles a été enregistré, ce serait le plus rapide mais nécessite plus de travail / pensée mis dans la conception et enlève le temps de la construction de la refroidir des choses.

Liste ne sera plus rapide si vous redimensionnez le tableau fréquemment, par exemple chaque fois que vous ajoutez un élément. Toutefois, si vous redimensionnez tous les quelques cadres, Liste et tableaux intégrés devrait être équivalent, peut-être encore plus rapide des réseaux.

Je l'ai vu la mise en œuvre Liste après décompilation et a constaté qu'il utilise Array.Resize () pour le tableau interne. Mais il gère les éléments compteur et utilise la longueur du tableau en tant que capacité et redimensionne le tableau avec un espace supplémentaire lorsque vous appelez Add (). Donc, je suppose que vous pouvez développer une stratégie d'allocation plus optimale que la liste pour votre cas. Mais vous devrez gérer des éléments manuellement contre. Aussi, vous aurez à vous débarrasser des indexeurs frais généraux lors de l'accès des éléments de tableau, car indexeurs à l'intérieur Liste des méthodes qui demandent seulement les éléments du tableau interne. Je pense qu'il vaut la peine de remplacer la liste par tableau avec redimensionnement manuel s'il est goulot d'étranglement que.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top