2015-02-28 8 views
8

Von Zeit zu Zeit stelle ich mit den Konzepten wie Null Müll oder effiziente Nutzung von Speicher usw. Als Beispiel im Abschnitt Features der bekannten Paket httprouter können Sie Folgendes sehen:Golang. Zero Müllverbreitung oder effiziente Nutzung von Speicher

Null Garbage: gesuchter und Abfertigungs-Prozess erzeugt Null-Bytes von Müll. Die einzigen Heapzuweisungen, die vorgenommen werden, bestehen darin, das Segment der Schlüssel/Wert-Paare für Pfadparameter zu erstellen. Wenn der Anforderungspfad keine Parameter enthält, ist keine einzelne Heapzuweisung erforderlich.

Auch zeigt dieses Paket sehr gute Benchmark-Ergebnisse im Vergleich zu Standard http.ServeMux Bibliothek:

BenchmarkHttpServeMux   5000  706222 ns/op   96 B/op  6 allocs/op 
BenchmarkHttpRouter   100000  15010 ns/op   0 B/op  0 allocs/op 

Soweit ich die zweiten hat verstehen (aus der Tabelle) keine Heap-Speicherzuweisung und Null Durchschnitt Anzahl der Zuweisungen pro Wiederholung.

Die Frage: Ich möchte ein grundlegendes Verständnis der Speicherverwaltung lernen. Wenn der Garbage Collector zuweist, wird Speicher freigegeben. Was bedeuten die Benchmark-Zahlen (die letzten beiden Spalten der Tabelle) und wie wissen die Leute, wann der Heap zuweist?

Ich bin absolut neu in der Speicherverwaltung, also ist es wirklich schwierig zu verstehen, was "unter der Haube" passiert. Die Artikel, die ich gelesen habe:

Antwort

8

Der Garbage Collector Speicher zuteilt nicht :-), es freigibt einfach. Go's Garbage Collector entwickelt sich weiter, für die Details schauen Sie sich das Design-Dokument https://docs.google.com/document/d/16Y4IsnNRCN43Mx0NZc5YXZLovrHvvLhK_h0KN8woTO4/preview?sle=true an und folgen Sie den Diskussionen auf den Golang Mailinglisten.

Die letzten beiden Spalten in der Benchmark-Ausgabe sind absolut simpel: Wie viele Bytes wurden insgesamt zugeordnet und wie viele Zuordnungen wurden während einer Iteration des Benchmark-Codes vorgenommen. (Diese Zuordnung erfolgt durch Ihren Code, nicht durch den Garbage Collector). Da jede Zuteilung eine potenzielle Müllproduktion ist, können diese Zahlen ein Konstruktionsziel sein.

Wann sind die Dinge auf dem Haufen zugeteilt? Immer wenn der Go-Compiler sich entscheidet! Der Compiler versucht, auf dem Stack zuzuordnen, aber manchmal muss er den Heap verwenden, insbesondere wenn ein Wert aus den lokalen Stack-Bases-Bereichen ausläuft. Diese Escape-Analyse wird gerade überarbeitet, daher ist es nicht einfach zu bestimmen, welcher Wert einer Heap- oder Stack-Zuweisung zugeordnet wird, insbesondere, da sich dies von Compiler-Version zu Version ändert.

Ich wäre nicht allzu besessen davon, Zuteilungen zu vermeiden, bis Ihr Benchmarking zu viel GC Overhead zeigt.

+0

@OP - "Nacharbeiten" heißt in diesem Fall, dass es Zeiten gibt, in denen Variablen während der Escape-Analyse nicht entkommen können - und das Go-Team ist sich dessen bewusst. Das bedeutet, dass Sie Heap-Zuweisungen erhalten, wenn Sie wirklich eine Stack-Zuweisung erhalten sollten. Irgendwo gibt es ein faszinierendes Dokument (ich kann es im Moment anscheinend nicht auf Go-Dev finden)."Escape-Analyse" wird der Begriff für Ihre Forschung hilfreich sein. Schöne Antwort Volker :) –

Verwandte Themen