Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann ich die Speichernutzung und Speicherbereinigung in meinem Go-Programm optimieren, wenn ich mit Zeichenfolgen und Zeigern arbeite?

Wie kann ich die Speichernutzung und Speicherbereinigung in meinem Go-Programm optimieren, wenn ich mit Zeichenfolgen und Zeigern arbeite?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-04 04:10:30880Durchsuche

 How can I optimize memory usage and garbage collection in my Go program when working with strings and pointers?

Garbage Collection und korrekte Verwendung von Zeigern in Go

Hintergrundinformationen zur Garbage Collection

Go verwendet einen Garbage Collector, um den Speicher automatisch zu verwalten. Der Garbage Collector gibt Speicher frei, auf den keine Zeiger mehr verweisen.

Zeiger und Strings

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.

Verwendung von Zeigern

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 :

  • In beiden Versionen verhindert das Speichern der Adresse des URL-Felds der Image-Struktur, dass die Image-Struktur durch Garbage Collection erfasst wird.
  • Version 2 führt eine zusätzliche Indirektionsebene ein und unnötige Objektzuweisung.

Optimale Lösung

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)
    }
}

String Interning

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)
    }
}

Cache leeren

Um den vom Interner-Cache verwendeten Speicher freizugeben, weisen Sie der Cache-Variablen Null zu, sobald die Internierung abgeschlossen ist:

cache = nil

Weitere Optimierungen

  • Nachdem Sie die tagToUrlMap erstellt haben, schneiden Sie überschüssige Kapazität aus den Slices in der Karte ab, um Speicher zu sparen.
  • Verwenden Sie bei Bedarf einen benutzerdefinierten Speicherzuweiser zur weiteren Optimierung Speichernutzung.

Fazit

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!

Stellungnahme:
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