Dies liegt daran, dass .NET auf modernen Prozessoren ausgeführt wurde. Die sind viel, viel schneller als der Speicherbus. Der Prozessor läuft bei etwa 2 Gigahertz. Der Arbeitsspeicher in Ihrer Maschine wird typischerweise mit ein paar hundert Megahertz getaktet. Das Lesen eines Bytes aus dem RAM dauert weit über hundert Taktzyklen.
Was die CPU-Caches auf modernen Prozessoren sehr wichtig macht, wird eine große Menge an Chip-Immobilien verbrannt, um die Caches so groß wie möglich zu machen. Typisch sind heute 64 KByte für den L1-Cache, der schnellste Speicher und physisch sehr nahe am Prozessorkern, 256 KByte für den L2-Cache, langsamer und weiter weg vom Kern, rund 8 MByte für den L3-Cache, langsamer und am weitesten entfernt weg, von allen Kernen auf dem Chip geteilt.
Um die Caches effektiv zu machen, ist es sehr wichtig, sequentiell auf den Speicher zuzugreifen. Das Lesen des ersten Bytes kann sehr teuer sein, wenn ein L3- oder RAM-Speicherzugriff erforderlich ist, die nächsten 63 Bytes sind sehr billig. Die Größe der "Cache-Zeile", die Einheit der Datenübertragung für den Speicherbus.
Dies macht ein Array mit Abstand die effektivste Datenstruktur, seine Elemente werden sequenziell im Speicher gespeichert. Und eine verkettete Liste ist bei weitem die schlechtest mögliche Datenstruktur, ihre Elemente sind natürlich durch den Speicher verstreut, was möglicherweise den sehr teuren Cache-Fehltreffer für jedes Element zur Folge hat.
Dementsprechend werden alle .NET-Sammlungen außer LinkedList <> als Arrays intern implementiert. Beachten Sie, dass ein Stack <> bereits natürlich als Array implementiert ist, da Sie nur ein Element vom Ende des Arrays verschieben können. Eine O (1) -Operation. Die Größe des Arrays wird amortisiert O (logN).
Ein weiterer Punkt ist, dass das zugrunde liegende Array in einer kreisförmigen Art und Weise verwendet wird, so dass Array-Elemente wiederverwendet werden, wenn sich der Kopf und der Schwanz bewegen (wenn die Grenzen nicht überschritten werden). –
3 Wörter: Overhead des Speichermanagements. – Mehrdad
@SebastianNegraszus danke. Wie hast du das gefunden? Ich habe viel gesucht und nichts gefunden. – KooKoo