Im folgenden Blog gibt es eine Aussage über den Vorteil von Arrays gegenüber verknüpften Listen:
Arrays haben eine bessere Cache-Lokalität, was einen ziemlich großen Unterschied in der Leistung bewirken kann.
Was bedeutet das? Ich verstehe nicht, wie die Cache-Lokalität einen enormen Leistungsvorteil bieten kann.
arrays
language-agnostic
linked-list
Vaibhav Mishra
quelle
quelle
Antworten:
Siehe meine Antwort zur räumlichen und zeitlichen Lokalität .
Insbesondere sind Arrays zusammenhängende Speicherblöcke, so dass große Teile davon beim ersten Zugriff in den Cache geladen werden. Dies macht es vergleichsweise schnell, auf zukünftige Elemente des Arrays zuzugreifen. Verknüpfte Listen hingegen befinden sich nicht unbedingt in zusammenhängenden Speicherblöcken und können zu mehr Cache-Fehlern führen, was die Zugriffszeit erhöht.
Berücksichtigen Sie die folgenden möglichen Speicherlayouts für ein Array
data
und eine verknüpfte Listel_data
großer StrukturenWenn wir dieses Array durchlaufen
ffff 0000
möchten, müssen wir für den ersten Zugriff auf zum Speichern in den Speicher gehen (ein sehr langsamer Vorgang in CPU-Zyklen). Nach dem ersten Zugriff befindet sich der Rest des Arrays jedoch im Cache, und nachfolgende Zugriffe sind viel schneller. Bei der verknüpften Listeffff 1000
müssten wir für den ersten Zugriff auf auch in den Speicher gehen. Leider wird der Prozessor den Speicher, der diesen Speicherort direkt umgibt, zwischenspeichern, etwa bis zuffff 2000
. Wie Sie sehen können, erfasst dies keines der anderen Elemente der Liste, was bedeutet, dass wir beim Zugriffl_data->next
erneut in den Speicher wechseln müssen.quelle
Wenn Sie ein Array verwenden, greifen Sie normalerweise auf Elemente zu, die sich in der Nähe befinden. Dies gilt insbesondere für den sequentiellen Zugriff auf ein Array.
Wenn Sie auf den Speicher zugreifen, werden Teile davon auf verschiedenen Ebenen zwischengespeichert. Die Cache-Lokalität bezieht sich auf die Wahrscheinlichkeit, dass sich aufeinanderfolgende Operationen im Cache befinden und somit schneller sind. In einem Array maximieren Sie die Wahrscheinlichkeit, dass sich der sequentielle Elementzugriff im Cache befindet.
Bei Listen gibt es beispielsweise im Gegenbeispiel keine Garantie dafür, dass Elemente, die nacheinander in der Liste erscheinen, tatsächlich nahe beieinander im Speicher angeordnet sind. Dies bedeutet weniger Cache-Treffer und eine verminderte Leistung.
quelle