Rumah >pembangunan bahagian belakang >Golang >Bagaimanakah Saya Boleh Memulakan Tatasusunan dalam Go dengan Cekap, Sama seperti memset C?

Bagaimanakah Saya Boleh Memulakan Tatasusunan dalam Go dengan Cekap, Sama seperti memset C?

Barbara Streisand
Barbara Streisandasal
2024-12-25 20:03:11241semak imbas

How Can I Efficiently Initialize Arrays in Go, Similar to C  's memset?

Adakah terdapat Setara dengan memset dalam Go?

Dalam C , fungsi memset membenarkan pemulaan tatasusunan yang cekap dengan nilai tertentu. Dalam Go, walaupun tiada persamaan langsung, beberapa teknik boleh mencapai hasil yang serupa.

Lelaran Gelung

Pendekatan paling mudah ialah menggunakan gelung untuk menetapkan setiap elemen tatasusunan kepada nilai yang dikehendaki.

func memsetLoop(a []int, v int) {
    for i := range a {
        a[i] = v
    }
}

Diulang copy()

Mengambil kesempatan daripada fungsi copy() yang sangat dioptimumkan, kami boleh memanfaatkan corak salinan berulang untuk menetapkan nilai tatasusunan dengan cekap.

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

Hasil Penanda Aras

Untuk menilai prestasi teknik ini, kami menanda arasnya antara satu sama lain untuk tatasusunan yang berbeza saiz.

var a = make([]int, 1000) // Size will vary

func BenchmarkLoop(b *testing.B) {
    for i := 0; i < b.N; i++ {
        memsetLoop(a, 10)
    }
}

func BenchmarkRepeat(b *testing.B) {
    for i := 0; i < b.N; i++ {
        memsetRepeat(a, 11)
    }
}

Hasilnya menunjukkan bahawa memsetRepeat() mengatasi prestasi memsetLoop() untuk tatasusunan yang lebih besar, menunjukkan kecekapannya untuk pemulaan pantas.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memulakan Tatasusunan dalam Go dengan Cekap, Sama seperti memset C?. 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