3 Stimmen

Binärer Heap vs. (neuer) B-Heap: Sollte er in der CLR/.NET implementiert werden, und wo?

Im folgenden Artikel wird eine alternative Heap-Struktur diskutiert, die berücksichtigt, dass die meisten Server virtualisiert sind und daher der meiste Speicher auf die Festplatte ausgelagert wird.

http://queue.acm.org/detail.cfm?id=1814327

Kann (oder sollte) ein .NET-Entwickler eine B-Heap-Datenstruktur implementieren, so dass Eltern-Kind-Beziehungen innerhalb der gleichen virtuellen Speicherseite beibehalten werden? Wie oder wo würde dies implementiert werden?

Klärung
Mit anderen Worten, wird diese Art von Datenstruktur in .NET als primärer Typ benötigt? Richtig, sie sollte entweder nativ in der CLR oder in einem p/invoke implementiert werden.

Ist diese binäre Heap-Optimierung sinnvoll, wenn ein Serveradministrator meine .NET-Anwendung in einer virtuellen Maschine bereitstellt? Wenn ja, wann ist sie sinnvoll? (Anzahl der Objekte, etc.)

1voto

Jon Hanna Punkte 106367

Zumindest bis zu einem gewissen Grad scheinen die BCL-Sammlungen die Belange des Paging zu berücksichtigen. Sie berücksichtigen auch CPU-Cache-Belange (was sich in gewisser Hinsicht überschneidet, da die Lokalität des Speichers beide beeinflussen kann, wenn auch auf unterschiedliche Weise).

Bedenken Sie, dass Queue<T> verwendet Arrays für die interne Speicherung. Bei reinem Zufallszugriff (d.h. wo es nie Kosten für Paging oder CPU-Cache-Flushing gibt) ist dies eine schlechte Wahl; die Warteschlange wird fast immer nur an einem Punkt hinzugefügt und an einem anderen entfernt werden und daher würde eine interne Implementierung als einfach verkettete Liste in fast jeder Hinsicht gewinnen (im Übrigen sollte eine verkettete Liste in dieser Hinsicht bei reinem Zufallszugriff nicht viel schlechter abschneiden als ein Array - was sie ebenfalls unterstützt). Wo die Array-basierte Implementierung besser abschneidet als eine einfach verkettete Liste, ist genau dann, wenn Paging und CPU-Cache berücksichtigt werden. MS hat sich für eine Lösung entschieden, die in der reinen Random-Access-Situation schlechter ist, aber in dem realen Fall, in dem Paging eine Rolle spielt, besser, so dass sie die Auswirkungen von Paging berücksichtigen.

Von außen ist das natürlich nicht ersichtlich - und sollte es auch nicht sein. Von außen betrachtet wollen wir etwas, das wie eine Warteschlange funktioniert; das Innere effizient zu gestalten ist ein anderes Anliegen.

Diesen Bedenken wird auch auf andere Weise Rechnung getragen. Die Art und Weise, wie die GC arbeitet, minimiert zum Beispiel den Umfang der erforderlichen Auslagerungen, da das Verschieben von Objekten nicht nur zu einer geringeren Fragmentierung, sondern auch zu weniger Seitenfehlern führt. Auch andere Sammlungen sind so implementiert, dass das Auslagern weniger häufig erforderlich ist, als es die unmittelbarste Lösung nahelegen würde.

Das sind nur ein paar Dinge, die mir bei meinen Recherchen aufgefallen sind. Ich würde gutes Geld darauf wetten, dass solche Bedenken auch an vielen anderen Stellen in der Arbeit des .NET-Teams berücksichtigt werden. Das Gleiche gilt für andere Frameworks. Bedenken Sie, dass das einzige große Leistungsproblem, das Cliff Click wiederholt in Bezug auf seine sperrfreie Java-Hashtabelle erwähnt (ich würde wirklich gerne meine C#-Implementierung überprüfen), neben dem der sperrfreien Gleichzeitigkeit (der Sinn der Übung) die Cache-Zeilen sind; und es ist auch das einzige andere Leistungsproblem, das er nicht abtut!

Bedenken Sie auch, dass die meisten Verwendungen der meisten Sammlungen ohnehin auf eine Seite passen!

Wenn Sie Ihre eigenen Sammlungen einführen oder eine Standardsammlung besonders intensiv nutzen, müssen Sie über diese Dinge nachdenken (manchmal reicht ein "Nein, kein Problem", manchmal nicht), aber das bedeutet nicht, dass sie nicht bereits in Bezug auf die BCL berücksichtigt wurden.

0voto

Addys Punkte 2411

Wenn Sie ein besonders spezielles Szenario und einen besonderen Algorithmus haben, können Sie könnte von dieser Art der Optimierung profitieren.

Aber im Allgemeinen gilt, dass bei der Neuimplementierung von Kernteilen des CLR-Frameworks ( obenauf der CLR könnte ich hinzufügen, dh in verwaltetem Code) Ihre Chancen, es zu tun effizienter als die CLR-Team tat, sind unglaublich gering. Ich würde es also nicht empfehlen, es sei denn, Sie haben bereits ein Profil Ihrer aktuellen Implementierung erstellt und Probleme im Zusammenhang mit der Lokalisierung von Daten im Speicher festgestellt. Und selbst dann werden Sie mehr für Ihr Geld bekommen, indem Sie Ihren Algorithmus optimieren, damit er funktioniert. besser mit dem CLR-Speicherverwaltungsschema und dem Versuch, es zu umgehen oder zu umgehen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X