Perché iterating tramite List è più costoso dell'iterazione tramite Array in .NET?

3

In base alle risposte riportate in questo post , viene eseguito il backup di List<T> da una matrice. Secondo questo articolo, elenca l'iterazione è considerevolmente più lento dell'iterazione dell'array.

Se gli elenchi sono matrici "sotto il cofano", perché impiegano più tempo per scorrere, specialmente con foreach?

Nota: si presume che gli elenchi siano implementati con gli array. Potrei aver appena interpretato l'informazione sbagliata.

    
posta JPtheK9 11.05.2015 - 13:47
fonte

1 risposta

6

L'iterazione attraverso una lista è (leggermente) più lenta di una matrice semplice a causa di alcuni fattori:

  1. Controlli sui limiti: questo è probabilmente il fattore più importante; ogni singolo indicizzatore dell'accesso alla lista eseguirà un controllo dei limiti. I limiti di controllo su un array raw possono spesso essere banalmente ottimizzati da un ciclo da parte del JIT.

  2. Costi delle chiamate di metodo: l'indicizzatore di una lista è una chiamata di metodo. Potrebbe risultare in linea, ma potrebbe anche non esserlo.

  3. Un ulteriore riferimento indiretto: per arrivare alla matrice all'interno della lista, è necessario dereferenziare il riferimento alla lista. Con un array, hai un riferimento direttamente ai dati necessari.

  4. Potenzialmente una copia aggiuntiva dell'elemento: quando si utilizza l'indicizzatore Elenco, si ottiene una copia dell'elemento indietro. Con un array, è possibile accedere direttamente all'elemento in memoria. A seconda di come appare il resto del codice, puoi evitare di creare una copia di tali dati.

  5. Quando si usa Enumerator per iterare, i costi sono per lo più dominati dal sopracitato controllo dei limiti e dalla verifica della "versione" per assicurarsi di non aver modificato l'elenco mentre si sta iterando su di esso.

risposta data 11.05.2015 - 21:59
fonte

Leggi altre domande sui tag