Perbandingan Prestasi: Slice Append vs Assign in Go
Apabila bekerja dengan slice dalam Go, operasi seperti menambahkan dan menetapkan elemen boleh mempunyai signifikan implikasi prestasi. Dua kaedah biasa untuk penambahan kepingan tersedia:
tambah(keping, nilai): Fungsi ini mencipta kepingan baharu dengan kapasiti lanjutan untuk menampung elemen baharu dan menyalin elemen sedia ada ke kepingan baharu.
keping[indeks] = nilai: Tugasan ini secara langsung mengubah suai elemen di indeks hirisan yang ditentukan tanpa membuat salinan baharu.
Untuk membandingkan prestasi kedua-dua pendekatan ini, dua fungsi penanda aras berikut telah dicipta:
func BenchmarkSliceAppend(b *testing.B) { a := make([]int, 0, b.N) for i := 0; i < b.N; i++ { a = append(a, i) } } func BenchmarkSliceSet(b *testing.B) { a := make([]int, b.N) for i := 0; i < b.N; i++ { a[i] = i } }
Hasilnya menunjukkan bahawa slice[index] = value adalah jauh lebih cepat daripada tambah(slice, value):
BenchmarkSliceAppend-4 200000000 7.87 ns/op 8 B/op 0 allocs/op BenchmarkSliceSet-4 300000000 5.76 ns/op 8 B/op
Memahami Perbezaan Prestasi
Mengapakah penetapan slice lebih cepat daripada slice append? Perbezaan utama terletak pada fakta bahawa tugasan ialah operasi mudah di tempat yang mengubah suai kepingan sedia ada tanpa memerlukan sebarang salinan atau pengagihan semula.
Sebaliknya, fungsi tambah melibatkan beberapa langkah:
Walaupun beberapa langkah ini dioptimumkan atau diselaraskan, keperluan untuk mengemas kini pembolehubah kepingan tempatan dalam setiap lelaran gelung menambah overhed pengiraan berbanding dengan operasi tugasan yang lebih mudah.
Atas ialah kandungan terperinci Adakah Slice Assignment Sentiasa Lebih Cepat Daripada Slice Append in Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!