Heim > Artikel > Backend-Entwicklung > Wie kann ich die Speichernutzung und Speicherbereinigung in meinem Go-Programm optimieren, wenn ich mit Zeichenfolgen und Zeigern arbeite?
Go verwendet einen Garbage Collector, um den Speicher automatisch zu verwalten. Der Garbage Collector gibt Speicher frei, auf den keine Zeiger mehr verweisen.
In Go sind Strings unveränderliche Werte, die als Wert übergeben werden. Wenn eine Funktion eine Zeichenfolge empfängt, erhält sie eine Kopie des Werts der Zeichenfolge, keinen Verweis auf die ursprüngliche Zeichenfolge.
Im bereitgestellten Code die folgenden Versionen des Zuordnungscodes sind nicht optimal.
Version 1:
tagToUrlMap := make(map[string][]*string) for _, image := range result { for _, tag := range image.Tags { tagToUrlMap[tag.Name] = append(tagToUrlMap[tag.Name], &image.URL) } }
Version 2:
tagToUrlMap := make(map[string][]*string) for _, image := range result { imageUrl = image.URL for _, tag := range image.Tags { tagToUrlMap[tag.Name] = append(tagToUrlMap[tag.Name], &imageUrl) } }
Probleme :
Die optimale Lösung ist die Verwendung des folgenden Codes:
tagToUrlMap := make(map[string][]string) for _, image := range result { imageURL := image.URL // Store the string value directly for _, tag := range image.Tags { tagName := tag.Name // Store the string value directly tagToUrlMap[tagName] = append(tagToUrlMap[tagName], imageURL) } }
Dieser Code erstellt für jede gefundene URL und jeden gefundenen Tag-Namen eine neue Zeichenfolge. Um die Speichernutzung weiter zu optimieren, kann String-Interning verwendet werden.
String-Interning beinhaltet das Speichern eindeutiger String-Werte in einem zentralen Cache. Wenn eine neue Zeichenfolge gefunden wird, wird sie mit dem Cache verglichen. Wenn sich die Zeichenfolge bereits im Cache befindet, wird der zwischengespeicherte Wert verwendet, anstatt eine neue Zeichenfolge zu erstellen.
Hier ist ein einfacher String-Interner:
var cache = map[string]string func intern(s string) string { if s2, ok := cache[s]; ok { return s2 } cache[s] = s return s }
Um den Interner zu verwenden, ändern Sie die Ordnen Sie den Code wie folgt zu:
tagToUrlMap := make(map[string][]string) for _, image := range result { imageURL := intern(image.URL) // Intern the string for _, tag := range image.Tags { tagName := intern(tag.Name) // Intern the string tagToUrlMap[tagName] = append(tagToUrlMap[tagName], imageURL) } }
Um den vom Interner-Cache verwendeten Speicher freizugeben, weisen Sie der Cache-Variablen Null zu, sobald die Internierung abgeschlossen ist:
cache = nil
Durch die direkte Verwendung von Zeichenfolgenwerten, die Internierung von Zeichenfolgen und das Löschen des Interner-Cache können Sie eine optimale Speichernutzung und eine effiziente Speicherbereinigung in Ihrem Go-Programm erreichen.
Das obige ist der detaillierte Inhalt vonWie kann ich die Speichernutzung und Speicherbereinigung in meinem Go-Programm optimieren, wenn ich mit Zeichenfolgen und Zeigern arbeite?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!