2017-09-18 2 views
0

Karte Zuordnung gegeben, in dem die anfänglichen space nicht angegeben wird, zum Beispiel:Wie viel Speicher reservieren Golong-Karten?

foo := make(map[string]int) 

Die documentation legt nahe, dass die Speicherzuordnung ist hier die Umsetzung abhängig. Also (wie) kann ich sagen, wie viel Speicher meine Implementierung dieser Map zuweist?

Antwort

3

Sie können das Go-Testwerkzeug verwenden, um die Größe beliebiger komplexer Datenstrukturen zu messen. Dies ist in dieser Antwort aufgeführt: How to get variable memory size of variable in golang?

Um die Größe einer Karte von make(map[string]int) erstellt zu messen, verwenden Sie die folgende Benchmark-Funktion:

var x map[string]int 

func BenchmarkEmptyMap(b *testing.B) { 
    for i := 0; i < b.N; i++ { 
     x = make(map[string]int) 
    } 
} 

mit Executing

go test -bench . -benchmem 

Das Ergebnis ist:

BenchmarkEmptyMap-4  20000000 110 ns/op  48 B/op 1 allocs/op 

So ist die Antwort auf meinem 64-b es Architektur: 48 Bytes.

Wie angedeutet, kann die Größe von der Architektur abhängen. Auch Größe kann auf der Anfangskapazität abhängen Sie make() passieren können, wie Sie in diesem Beispiel sehen können:

func BenchmarkEmptyMapCap100(b *testing.B) { 
    for i := 0; i < b.N; i++ { 
     x = make(map[string]int, 100) 
    } 
} 

Ausgang:

BenchmarkEmptyMapCap100-4 1000000 1783 ns/op 4176 B/op 3 allocs/op 

Eine Karte vom Typ map[string]int mit einer Anfangskapazität von 100 jetzt benötigt 4176 Bytes (auf 64-Bit-Arch).

Die Standardanfangskapazität liegt bei 7, wenn nicht explizit angegeben.

1

Wenn Sie sich den source Go-Kartentyp ansehen, sehen Sie, dass eine Map aus einem Header (Typ hmap) und einem Array von Buckets (Typ bmap) besteht. Wenn Sie eine neue Map erstellen und den Anfangsbereich nicht angeben (hint), wird nur ein Bucket erstellt.

Ein Header besteht aus mehreren Feldern:

1 * int,
2 * uint8,
1 * uint16,
1 * uint32,
2 * unsafe.Pointer,
1 * uintptr.

Größe der Typen int, uintptr und unsafe.Pointer entspricht der Größe eines Wortes (8 Bytes auf 64-Bit-Maschinen).

Ein Bucket besteht aus einem Array von 8 * uint8.

Dies ergibt insgesamt 40 + 8 = 48 Bytes (64-Bit-Architektur)

Verwandte Themen