Während Fragen haben, bevor über verkettete Listen gegenüber Arrays gefragt, die Antworten meist einkochen zu dem, was die meisten von uns haben wahrscheinlich schon irgendwann gelernt:verlinkte Listen, Arrays und Hardware-Speicher-Caches
- Listen sind gut Einsetzen und
- Arrays sind gut random access
Jetzt anständig Leute wie Bjarne Stroustrup argued haben zu löschen, die Arrays praktisch immer verkettete Listen übertreffen, weil sie viele bessere Nutzung des cachin machen g Architektur implementiert in moderner Hardware. Er stellt außerdem fest, dass der Leistungsvorteil von Arrays mit ihrer Größe zunimmt.
Während ich im Grunde seine Argumente verstehe und stimme ihm zu, frage ich mich, ob dies immer noch wahr ist, wenn die Größe des Arrays deutlich größer als die Größe des Caches ist. Ich würde sagen, dass dies der Fall ist, wenn Leistung wirklich zählt.
Zusammenfassend: Sind Arrays in den meisten Fällen immer noch besser als Listen, auch wenn ihre Größe viel größer ist als die Cache-Größe und ein großer Prozentsatz der Operationen Einfügungen oder Löschungen sind? Wenn ja, wie kann das erklärt werden?
CPU-Caches laden Daten in Blöcke von sequenziellen Adressen, so dass beim sequentiellen Zugriff, der einen Fehltreffer erzeugt, mehrere nachfolgende Lesevorgänge den Cache treffen. Für die verknüpfte Liste funktioniert das nicht. Siehe http://igoro.com/archive/gallery-of-processor-cache-effects/ –
@VictorSorokin: Ja, ich verstehe, dass Caching für die Performance der Linked List wenig oder keinen Nutzen bringt, aber das war nicht meine Frage. Ich verstehe auch, dass das Lesen und Schreiben von sequentiellen Array-Elementen sehr von Caching profitieren wird, selbst wenn das Array größer als der Cache ist, aber was ist mit Einfügen und Löschen? –
Eigentlich sind Link Beispiel 2/3 Erklärungen und Ergebnisse für mich verwirrend, ich habe versucht, sie zu reproduzieren, aber gescheitert. Trotzdem gilt die allgemeine Idee immer noch. Bezüglich Einfügungen/Löschungen - wenn Ihre App von ihnen dominiert wird, profitieren Sie sicherlich von Listen. Ein anderer Ansatz, "best of two worlds", besteht darin, dass Autoren mit LLs arbeiten und Daten in ein Array für (sequenzielle) Leser kopieren. –