Krótka odpowiedź brzmi: Tak, jest różnica. Listy o stałej długości mają mniejszy narzut zarówno w procesorze, jak i pamięci niż na listach o zmiennej długości.
Uwaga: Odpowiadam na to wyłącznie z perspektywy VM, dotyczy to tylko kodu działającego na maszynie wirtualnej Dart. Podczas uruchamiania przy użyciu wykonywania JS po kompilacji z dart2js obowiązują inne reguły.
Teraz trochę więcej szczegółów na temat bieżącej realizacji:
Kiedy trzymasz odniesienie do listy o zmiennej długości w Dart, masz odniesienie do obiektu, który utrzymuje aktualną długość i odniesienie do rzeczywistych danych. Rzeczywiste dane to lista o stałej długości z wystarczającą pojemnością do przechowywania elementów. Zwykle ten magazyn podkładowy ma większą pojemność niż jest to bezwzględnie potrzebne do przechowywania wymaganych elementów długości. To pozwala nam szybko uzyskać add elementów przez większość czasu.
Jeśli teraz uzyskujesz dostęp do elementów na tej liście o zmiennej długości przy użyciu [] lub []=, to implementacja musi najpierw wykonać test długości na liście o zmiennej długości, a następnie odczytać odwołanie do magazynu zaplecza i uzyskać dostęp do żądany element ze sklepu podkładowego. Naiwna implementacja będzie musiała wysłać kolejną kontrolę długości przed uzyskaniem dostępu do magazynu kopii zapasowych, ale istnieje kilka optymalizacji, które wykonuje kompilator optymalizujący maszyny wirtualnej: Nie ma potrzeby sprawdzania redundantnej długości, zakłada się, że obiekt tablicy o stałej długości jest używany jako magazyn zaplecza unikając kontroli typu, a następnie cała ta sekwencja jest umieszczona na stronie wywołania. Mimo to kod ma dwa obciążenia zależne, zanim dostaniesz dane.
Ponieważ dane dla obiektów o stałej długości są zaznaczone wewnątrz obiektu, można uniknąć obciążenia zależnego. Podobnie optymalizujący kompilator ustawia typowe wzorce dostępu i próbuje usunąć nadmiarowe sprawdzenia długości.
Jeśli chodzi o narzut pamięci, lista o stałej długości zajmuje tylko tyle pamięci, ile potrzeba, aby zmieścić wszystkie elementy w jednym obiekcie. Wręcz przeciwnie, lista o zmiennej długości potrzebuje dwóch obiektów i prawie zawsze pozostawia pewną pojemność w magazynie zaplecza. Może to być znaczne obciążenie pamięci w bieżącej implementacji. Gdy magazyn zaplecza ma pojemność, gdy wywoływana jest nazwa add, rozmiar magazynu kopii zapasowej jest podwojony, a wszystkie bieżące elementy są kopiowane do nowego magazynu kopii zapasowej, zanim można dodać dodatkowy element. Prawdopodobnie zmieni się to jednak w przyszłości.