Heim > Backend-Entwicklung > Golang > Warum zeigen „map[string]string' und „map[string]bool' in Go eine ähnliche Speichernutzung?

Warum zeigen „map[string]string' und „map[string]bool' in Go eine ähnliche Speichernutzung?

Mary-Kate Olsen
Freigeben: 2024-12-18 02:17:11
Original
440 Leute haben es durchsucht

Why Does `map[string]string` and `map[string]bool` Show Similar Memory Usage in Go?

String-Speichernutzung in Golang

Beim Optimieren eines Codes mit einem Map[string]string, dessen Werte nur „A“ oder „B“ sind " könnte die Annahme sein, dass ein Map[string]bool aufgrund seines kleineren Werttyps effizienter wäre. Tests haben jedoch ergeben, dass die Speichernutzung für beide Karten überraschend gleich ist.

unsafe.Sizeof() verstehen

Um dies zu untersuchen, ist unsafe.Sizeof() Wird zur Messung der Speichernutzung verwendet. Es ist jedoch wichtig zu beachten, dass unsafe.Sizeof() nur die „geringe“ Größe der Daten meldet. Im Fall von Karten implementiert Go diese mithilfe von Zeigern. Daher meldet unsafe.Sizeof(somemap) die Größe des Zeigers und nicht die Daten der gesamten Karte.

String-Speicherdarstellung

Strings in Go werden durch einen Header dargestellt bestehend aus einem Zeiger auf Daten und einer Länge. Der Typ „reflect.StringHeader“ definiert diese Struktur:

type StringHeader struct {
    Data uintptr
    Len  int
}
Nach dem Login kopieren

Daher meldet unsafe.Sizeof(somemap) nur die Größe dieses Headers, die unabhängig vom String-Wert ist.

Tatsächlicher Speicherbedarf für Karten

Um den tatsächlichen Speicherverbrauch für Karten zu ermitteln, ist es wichtig, Folgendes zu berücksichtigen Daten, auf die sie verweisen. Mit anderen Worten: len(str) int(unsafe.Sizeof(str)) liefert eine genauere Schätzung.

Zusätzliche Überlegungen

Strings in Go speichern UTF-8 Bytesequenzen im Speicher. Die Funktion len() meldet die Bytelänge, sodass die tatsächliche Speichernutzung für einen String wie folgt angenähert werden kann:

stringSize := len(str) + int(unsafe.Sizeof(str))
Nach dem Login kopieren

Es ist auch wichtig zu bedenken, dass durch das Slicing eines vorhandenen Strings ein neues Backing-Array für den Slice zugewiesen wird . Selbst wenn nicht mehr auf die ursprüngliche Zeichenfolge verwiesen wird, bleibt das Hintergrundarray im Speicher, um das Slice zu unterstützen.

Das obige ist der detaillierte Inhalt vonWarum zeigen „map[string]string' und „map[string]bool' in Go eine ähnliche Speichernutzung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage