Bagaimanakah saya boleh mengoptimumkan penggunaan memori dan pengumpulan sampah dalam program Go saya apabila bekerja dengan rentetan dan penunjuk?

Mary-Kate Olsen
Lepaskan: 2024-11-04 04:10:30
asal
879 orang telah melayarinya

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

Pengumpulan Sampah dan Penggunaan Penunjuk yang Betul dalam Go

Latar Belakang pada Pengumpulan Sampah

Go menggunakan pengumpul sampah untuk mengurus memori secara automatik. Pengumpul sampah membebaskan memori yang tidak lagi dirujuk oleh mana-mana penunjuk.

Penunjuk dan Rentetan

Dalam Go, rentetan ialah nilai tidak berubah yang diluluskan oleh nilai. Apabila fungsi menerima rentetan, ia menerima salinan nilai rentetan, bukan rujukan kepada rentetan asal.

Menggunakan Penunjuk

Dalam kod yang disediakan, versi kod pemetaan berikut tidak optimum.

Versi 1:

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

for _, image := range result {
    for _, tag := range image.Tags {
        tagToUrlMap[tag.Name] = append(tagToUrlMap[tag.Name], &image.URL)
    }
}
Salin selepas log masuk

Versi 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)
    }
}
Salin selepas log masuk

Isu:

  • Dalam kedua-dua versi, menyimpan alamat medan URL struct Imej akan menghalang struct Imej daripada menjadi sampah dikumpul.
  • Versi 2 memperkenalkan tahap penyimpangan tambahan dan peruntukan objek yang tidak perlu.

Penyelesaian Optimum

Penyelesaian optimum ialah menggunakan kod berikut:

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)
    }
}
Salin selepas log masuk

String Interning

Kod ini mencipta rentetan baharu untuk setiap URL dan nama tag ditemui. Untuk mengoptimumkan penggunaan memori dengan lebih lanjut, string interning boleh digunakan.

String interning melibatkan penyimpanan nilai rentetan unik dalam cache pusat. Apabila rentetan baharu ditemui, ia diperiksa terhadap cache. Jika rentetan sudah berada dalam cache, nilai cache digunakan dan bukannya membuat rentetan baharu.

Berikut ialah interner rentetan mudah:

var cache = map[string]string

func intern(s string) string {
    if s2, ok := cache[s]; ok {
        return s2
    }
    cache[s] = s
    return s
}
Salin selepas log masuk

Untuk menggunakan interner, ubah suai kod pemetaan seperti berikut:

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)
    }
}
Salin selepas log masuk

Mengosongkan Cache

Untuk membebaskan memori yang digunakan oleh pelatih cache, tetapkan sifar kepada pembolehubah cache setelah latihan selesai:

cache = nil
Salin selepas log masuk

Pengoptimuman Selanjutnya

  • Selepas membina tagToUrlMap, potong sebarang kapasiti berlebihan daripada kepingan dalam peta ke simpan memori.
  • Jika mahu, gunakan pengagih memori tersuai untuk mengoptimumkan memori lagi penggunaan.

Kesimpulan

Dengan menggunakan nilai rentetan secara langsung, rentetan interning dan mengosongkan cache interner, anda boleh mencapai penggunaan memori yang optimum dan pengumpulan sampah yang cekap dalam program Go anda.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengoptimumkan penggunaan memori dan pengumpulan sampah dalam program Go saya apabila bekerja dengan rentetan dan penunjuk?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!