Golang. Null Müllverbreitung oder effiziente Nutzung von Speicher

8

Von Zeit zu Zeit begegne ich Konzepten wie Null Müll oder effizienter Nutzung von Speicher usw. Als Beispiel im Abschnitt Features bekannter Pakete Ссылка können Sie Folgendes sehen:

  

Zero Garbage: Der Abgleich- und Dispatching-Prozess generiert null Byte 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 Heap-Zuweisung erforderlich.

Auch dieses Paket zeigt sehr gute Benchmark-Ergebnisse im Vergleich zum http.ServeMux der Standardbibliothek:

%Vor%

Soweit ich verstehe, hat der zweite (aus der Tabelle) keine Heap-Speicherzuweisung und keine durchschnittliche Anzahl von Zuweisungen pro Wiederholung.

Die Frage : Ich möchte ein grundlegendes Verständnis des Speichermanagements lernen. Wenn der Garbage Collector Speicher zuweist / delokalisiert. 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, daher ist es wirklich schwierig zu verstehen, was "unter der Haube" passiert. Die Artikel, die ich gelesen habe:

Timur Fayzrakhmanov 28.02.2015, 10:11
quelle

1 Antwort

8

Der Garbage Collector reserviert keinen Speicher :-), es wird einfach freigegeben. Go's Garbage Collector entwickelt sich weiter, für die Details schauen Sie sich das Design-Dokument Ссылка an Folge der Diskussion 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 potentielle Erzeugung von Müll ist, können diese Zahlen ein Konstruktionsziel sein.

Wann werden Dinge auf dem Heap zugewiesen? 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 derzeit ü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.

    
Volker 28.02.2015, 12:52
quelle