Rumah >pembangunan bahagian belakang >Golang >Setara Memset Go: Bagaimana Memulakan Tatasusunan dengan Cekap dengan Nilai Bukan Sifar?
Go Analog for Memset
Soalan:
Go pengaturcara mencari kaedah yang cekap sama dengan Memset C untuk memulakan tatasusunan dengan nilai bukan sifar, seperti gelung asas perlahan.
Jawapan:
Walaupun Go tidak mempunyai fungsi memset yang jelas, terdapat pendekatan yang dioptimumkan yang meniru fungsinya.
Gelung- Penyelesaian Berasaskan:
Alternatif paling mudah ialah gelung yang berulang melalui tatasusunan, memberikan nilai yang diingini kepada setiap elemen:
func memsetLoop(a []int, v int) { for i := range a { a[i] = v } }
Penyelesaian Berdasarkan Salin:
Fungsi copy() yang dioptimumkan Go boleh dimanfaatkan untuk memulakan tatasusunan dengan cepat. Dengan menetapkan elemen pertama secara manual dan berulang kali menyalin bahagian yang diisi, bilangan lelaran dikurangkan kepada log(n):
func memsetRepeat(a []int, v int) { if len(a) == 0 { return } a[0] = v for bp := 1; bp < len(a); bp *= 2 { copy(a[bp:], a[:bp]) } }
Perbandingan Prestasi:
Untuk tatasusunan kecil, penyelesaian berasaskan gelung adalah sedikit lebih pantas. Walau bagaimanapun, apabila saiz tatasusunan berkembang, penyelesaian berasaskan salinan menjadi lebih pantas dengan ketara disebabkan bilangan lelarannya yang berkurangan.
Keputusan Penanda Aras:
Array Size | Loop-Based | Copy-Based |
---|---|---|
100 elements | 1.15x slower | |
1,000 elements | 2.5x slower | |
10,000 elements | 2x slower | |
100,000 elements | 1.5x slower |
Atas ialah kandungan terperinci Setara Memset Go: Bagaimana Memulakan Tatasusunan dengan Cekap dengan Nilai Bukan Sifar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!