Je pense que les performances seront assez similaires. La surcharge qui est impliquée dans l'utilisation d'une liste par rapport à un tableau est, à mon avis, lorsque vous ajoutez des éléments à la liste, et lorsque la liste doit augmenter la taille du tableau qu'elle utilise en interne, lorsque la capacité du tableau est atteinte.
Supposons que vous ayez une liste avec une capacité de 10, alors la liste augmentera sa capacité une fois que vous voudrez ajouter le 11ème élément. Vous pouvez réduire l'impact sur les performances en initialisant la capacité de la liste au nombre d'éléments qu'elle contiendra.
Mais, pour savoir si l'itération sur une liste est aussi rapide que l'itération sur un tableau, pourquoi ne pas l'évaluer ?
int numberOfElements = 6000000;
List<int> theList = new List<int> (numberOfElements);
int[] theArray = new int[numberOfElements];
for( int i = 0; i < numberOfElements; i++ )
{
theList.Add (i);
theArray[i] = i;
}
Stopwatch chrono = new Stopwatch ();
chrono.Start ();
int j;
for( int i = 0; i < numberOfElements; i++ )
{
j = theList[i];
}
chrono.Stop ();
Console.WriteLine (String.Format("iterating the List took {0} msec", chrono.ElapsedMilliseconds));
chrono.Reset();
chrono.Start();
for( int i = 0; i < numberOfElements; i++ )
{
j = theArray[i];
}
chrono.Stop ();
Console.WriteLine (String.Format("iterating the array took {0} msec", chrono.ElapsedMilliseconds));
Console.ReadLine();
Sur mon système, l'itération sur le tableau a pris 33msec ; l'itération sur la liste a pris 66msec.
Pour être honnête, je ne m'attendais pas à ce que la variation soit si importante. Donc, j'ai mis mon itération dans une boucle : maintenant, j'exécute les deux itérations 1000 fois. Les résultats sont :
l'itération de la liste a pris 67146 msec L'itération du tableau prend 40821 msec
Aujourd'hui, l'écart n'est plus aussi important, mais il reste...
J'ai donc lancé .NET Reflector, et le getter de l'indexeur de la classe List ressemble à ceci :
public T get_Item(int index)
{
if (index >= this._size)
{
ThrowHelper.ThrowArgumentOutOfRangeException();
}
return this._items[index];
}
Comme vous pouvez le constater, lorsque vous utilisez l'indexeur de la liste, cette dernière vérifie si vous ne sortez pas des limites du tableau interne. Cette vérification supplémentaire a un coût.
4 votes
En dehors des questions de performance, je préfère utiliser les tableaux plutôt que les listes pour leur taille fixe (dans les cas où il n'est pas nécessaire de changer le nombre d'éléments, bien sûr). Lorsque je lis du code existant, je trouve utile de savoir rapidement qu'un élément est forcé pour avoir une taille fixe, plutôt que de devoir inspecter le code plus bas dans la fonction.
3 votes
T[]
vs.List<T>
peut faire une grande différence en termes de performances. Je viens d'optimiser une application extrêmement intensive en boucles (imbriquées) pour passer des listes aux tableaux sur .NET 4.0. Je m'attendais à une amélioration de 5 à 10 %, mais j'ai obtenu une accélération de plus de 40 % ! Aucun autre changement que le passage direct de la liste au tableau. Toutes les énumérations ont été faites avecforeach
déclarations. D'après la réponse de Marc Gravell, il semble queforeach
conList<T>
est particulièrement mauvais.