12
votes

Ce qui est plus rapide, la liste .ReMove (t) ou la liste .RemoVeat (int)?

est Liste .ReMove (t) plus rapide que la liste .reMOVeat (int) méthode dans les collections .NET? Est la vitesse différente des types de valeur ou des types de référence?


0 commentaires

5 Réponses :


18
votes

list.remove (t) utilise indexof et retirer (int) dans sa mise en œuvre. Alors list.removeat (int) est plus rapide.

public bool Remove(T item)
{
    int index = this.IndexOf(item);
    if (index >= 0)
    {
        this.RemoveAt(index);
        return true;
    }
    return false;
}


2 commentaires

Mais si cela rend votre code pire ou illisible, peut aussi continuer à utiliser à distance (t).


this.indexof (item) Le code a un prix énorme en termes de performances car elle analyse la totalité de la matrice de support jusqu'à ce qu'elle puisse être supprimée. Spécialement lorsque l'article à supprimer est à la fin de la liste, il analyse la liste complète à chaque fois qu'une suppression est demandée. Cela a eu lieu avec moi lorsque j'essayais d'implémenter une structure de données de pile à l'aide d'une liste list . Comme la taille de la liste augmente considérablement, par exemple. Au-delà des éléments 10K, la suppression de la fin à l'aide de Supprimer (t) peut épauler des ravages avec votre programme.



0
votes

Supprimer (t) fait entrer en interne un appel à retirer (int) Donc, faire directement une removeat est plus rapide.

Mais que voulez-vous atteindre?


0 commentaires

24
votes

réponse simple:

En général, RemoVeat est plus rapide, mais pas toujours extrêmement extrêmement.

réponse longue:

Envisagons simplement de trouver d'abord l'article approprié. La méthode Suppression doit rechercher la liste de l'élément correspondant à l'objet donné et est ainsi O (n) temps en général. removeat sur une liste peut simplement indexer l'élément donné et est ainsi O (1) .

Maintenant, supprimer un élément de la fin d'une liste est toujours O (1) bien sûr, mais en général retrait, un élément prend O (n) temps, Parce que le remodelage doit être fait (déplacer des objets après le retrait d'une avancée). Par conséquent, dans le cas général, la complexité totale du temps pour le retrait est soit O (n) + o (n) ou O (n) + o (1) pour supprimer et retirer respectivement, donc simplement o (n) dans les deux cas. Toutefois, Removeat est garanti d'être au moins aussi rapide, bien que la mise à l'échelle est la même si vous savez que vous le retirez à / près de la fin.


1 commentaires

Merci, maintenant, je comprends pourquoi MSDN dit que retirer est O (n) où n est compté-index



-1
votes

Utiliser system.diagnostics.stopwatch ()

Je voudrais juste créer une petite application de console pour vérifier, ce qui est plus rapide.


0 commentaires

0
votes

étant donné qu'un .NET est infecté un vecteur (ou une matrice), pas une liste liée, RemoVeat () est plus rapide.


0 commentaires