La risposta breve è: Sì, c'è una differenza. Gli elenchi di lunghezza fissa hanno un overhead inferiore sia in termini di CPU che di memoria rispetto agli elenchi di lunghezza variabile.
Nota: la risposta è puramente dal punto di vista della VM, quindi si applica solo al codice in esecuzione su Dart VM. Quando si esegue l'esecuzione di JS dopo la compilazione con dart2js, si applicano altre regole.
Ora un po 'più particolare circa l'attuale implementazione:
Quando si tiene un riferimento a un elenco di lunghezza variabile a Dart, si dispone di un riferimento a un oggetto che mantiene la lunghezza attuale e un riferimento ai dati reali. I dati effettivi sono un elenco di lunghezza fissa con una capacità sufficiente per contenere gli elementi. Di solito questo backing store ha più capacità di quanto sia strettamente necessario per contenere gli elementi di lunghezza richiesti. Ciò ci consente di utilizzare rapidamente gli elementi add.
Se ora accedere agli elementi in questo elenco di lunghezza variabile utilizzando [] o []=, quindi l'attuazione deve prima fare il controllo di lunghezza con l'elenco di lunghezza variabile, allora legge il riferimento alla memoria di supporto fuori e accede alla elemento richiesto dal backing store. Un'implementazione ingenua dovrebbe emettere un altro controllo di lunghezza prima di accedere al backing store, ma ci sono diverse ottimizzazioni eseguite dal compilatore di ottimizzazione della VM: il controllo della lunghezza ridondante viene evitato, si presume che un oggetto array a lunghezza fissa venga utilizzato come archivio di supporto evitando un controllo del tipo e quindi tutta questa sequenza è in linea sul sito di chiamata. Tuttavia, il codice ha due carichi dipendenti prima di arrivare effettivamente ai dati.
Poiché i dati per oggetti a lunghezza fissa sono allineati all'interno dell'oggetto, il carico dipendente può essere evitato. Allo stesso modo il compilatore di ottimizzazione inline i modelli di accesso comuni e tenta di rimuovere i controlli di lunghezza ridondanti.
Per quanto riguarda l'overhead di memoria, l'elenco a lunghezza fissa consuma solo la quantità di memoria necessaria per adattare tutti gli elementi in un singolo oggetto. Al contrario, un elenco di lunghezza variabile ha bisogno di due oggetti e quasi sempre ha una capacità residua nel backing store. Questo può essere un sovraccarico significativo della memoria nell'attuale implementazione. Quando il backing store è in grado di chiamare add, la dimensione del backing store viene raddoppiata e tutti gli elementi correnti vengono copiati nel nuovo backing store prima che sia possibile aggiungere l'elemento extra. Questo probabilmente cambierà in futuro però.
fonte
2013-04-11 18:19:31