Rumah >pembangunan bahagian belakang >Golang >Mengapa Panjang Rentetan Nampaknya Tiada Kesan terhadap Penggunaan Memori dalam `map[rentetan]rentetan` Go?

Mengapa Panjang Rentetan Nampaknya Tiada Kesan terhadap Penggunaan Memori dalam `map[rentetan]rentetan` Go?

Susan Sarandon
Susan Sarandonasal
2024-12-26 12:24:11536semak imbas

Why Does String Length Seem to Have No Impact on Memory Usage in Go's `map[string]string`?

Penggunaan Memori Rentetan di Golang

Apabila mengoptimumkan kod menggunakan rentetan[rentetan] peta dengan hanya dua kemungkinan nilai ("A" atau "B"), mengurangkannya kepada map[string]bool kelihatan seperti peningkatan yang jelas untuk prestasi. Walau bagaimanapun, ujian mendedahkan pemerhatian yang mengejutkan: penggunaan memori rentetan panjang ("a2") tidak berbeza daripada rentetan aksara tunggal ("a").

Penjelasan

Untuk memahami tingkah laku ini, adalah penting untuk ambil perhatian bahawa tidak selamat.Sizeof() tidak mengambil kira saiz struktur data yang dirujuk. Sebaliknya, ia hanya melaporkan saiz "cetek" nilai yang diluluskan.

Dalam Go, peta ialah penunjuk kepada struktur data. Memanggil tidak selamat.Sizeof(somemap) mengembalikan saiz penunjuk ini, bukan memori sebenar yang digunakan oleh elemen dalam peta.

Begitu juga, rentetan dalam Go diwakili oleh pengepala yang mengandungi penunjuk dan panjang. Memanggil tidak selamat.Sizeof(somestring) akan mengembalikan saiz pengepala ini, yang tidak bergantung pada panjang rentetan.

Keperluan Memori Rentetan

Memori sebenar yang diperlukan untuk menyimpan nilai rentetan dalam ingatan adalah sama dengan panjang jujukan bait yang dikodkan UTF-8 ditambah saiz pengepalanya. Untuk mengira ini, anda boleh menggunakan formula berikut:

stringSize = len(str) + int(unsafe.Sizeof(str))

Penghirisan Rentetan dan Penggunaan Memori

Ia juga penting untuk diingat bahawa penghirisan rentetan mencipta pengepala baharu yang menghala ke tatasusunan belakang rentetan asal. Ini bermakna walaupun rentetan yang dihiris (s2) adalah kecil, keseluruhan tatasusunan sandaran rentetan (s) asal masih akan dikekalkan dalam ingatan.

Atas ialah kandungan terperinci Mengapa Panjang Rentetan Nampaknya Tiada Kesan terhadap Penggunaan Memori dalam `map[rentetan]rentetan` Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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