首頁 > 後端開發 > Golang > 使用字串和指標時,如何優化 Go 程式中的記憶體使用和垃圾收集?

使用字串和指標時,如何優化 Go 程式中的記憶體使用和垃圾收集?

Mary-Kate Olsen
發布: 2024-11-04 04:10:30
原創
972 人瀏覽過

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

Go 中的垃圾收集和指針的正確使用

垃圾收集的背景

Go 使用垃圾收集器來自動管理記憶體。垃圾收集器會釋放不再被任何指標引用的記憶體。

指標和字串

在 Go 中,字串是按值傳遞的不可變值。當函數接收字串時,它接收的是字串值的副本,而不是對原始字串的參考。

使用指標

在提供的程式碼中,映射程式碼的以下版本不是最佳的。

版本1:

tagToUrlMap := make(map[string][]*string)

for _, image := range result {
    for _, tag := range image.Tags {
        tagToUrlMap[tag.Name] = append(tagToUrlMap[tag.Name], &image.URL)
    }
}
登入後複製

版本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)
    }
}
登入後複製

問題:🎜>

    問題:
  • 在這兩個版本中,儲存Image 結構的URL 欄位的位址將防止Image 結構被垃圾收集。
版本 2 引入了額外的間接級別,並且不必要的物件分配。

最佳解決方案

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

此程式碼為遇到的每個URL 和標記名稱建立一個新字串。為了進一步優化記憶體使用,可以使用字串駐留。

字串駐留涉及在中央快取中儲存唯一的字串值。當遇到新字串時,會根據快取進行檢查。如果字串已經在快取中,則使用快取的值而不是建立新字串。

var cache = map[string]string

func intern(s string) string {
    if s2, ok := cache[s]; ok {
        return s2
    }
    cache[s] = s
    return s
}
登入後複製
這是一個簡單的字串內部函數:

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 = nil
登入後複製
要釋放interner快取使用的內存,請在interning完成後將nil分配給快取變數:

    進一步最佳化
  • 建置tagToUrlMap 後,修剪映射中切片的任何多餘容量以節省內存。
如果需要,可以使用自訂記憶體分配器來進一步最佳化

結論

透過直接使用字串值、字串實習以及清除實習者的緩存,您可以在Go 程式中實現最佳的記憶體使用和高效的垃圾收集。

以上是使用字串和指標時,如何優化 Go 程式中的記憶體使用和垃圾收集?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板