Mempercepatkan Operasi Penambahan Slice dalam Go
Dalam Go, kepingan ialah struktur data penting yang menyimpan jujukan nilai. Apabila menambahkan elemen pada kepingan, adalah penting untuk mengoptimumkan prestasi. Artikel ini meneroka perbezaan prestasi antara dua kaedah menambahkan pada kepingan: tambah dan tugasan langsung (=).
Analisis Penanda Aras
Untuk membandingkan prestasi, kami menjalankan dua penanda aras menggunakan kod berikut:
func BenchmarkSliceAppend(b *testing.B) { a := make([]int, 0, b.N) // Create an empty slice with sufficient capacity for i := 0; i < b.N; i++ { a = append(a, i) // Append i to the slice } } func BenchmarkSliceSet(b *testing.B) { a := make([]int, b.N) // Create a slice with size b.N for i := 0; i < b.N; i++ { a[i] = i // Assign i to the slice's ith element } }
Hasil penanda aras menunjukkan bahawa tugasan langsung (a[i] = i) adalah ketara lebih pantas daripada menggunakan append:
BenchmarkSliceAppend-4 200000000 7.87 ns/op 8 B/op 0 allocs/op BenchmarkSliceSet-4 300000000 5.76 ns/op 8 B/op
Mengapa Tugasan Lebih Cepat daripada Append?
Perbezaan prestasi berpunca daripada operasi berbeza yang dilakukan oleh setiap kaedah:
Tambah (a = tambah(a, i)): Fungsi ini melibatkan proses yang lebih kompleks:
Ringkasnya, setiap operasi tambah melibatkan overhed tambahan dalam menyalin pengepala kepingan dan mencipta kepingan sementara, manakala tugasan langsung hanya mengubah suai elemen hirisan sedia ada. Overhed ini menyumbang kepada perbezaan prestasi yang diperhatikan.
Pengesyoran
Untuk prestasi optimum apabila ditambahkan pada kepingan, adalah disyorkan untuk pra-peruntukkan kapasiti yang mencukupi menggunakan make dan bukannya berulang kali menggunakan fungsi tambah. Ini menghapuskan keperluan untuk peruntukan memori dinamik dan penyatuan semula, meningkatkan kecekapan dengan ketara.
Atas ialah kandungan terperinci Adakah Tugasan Terus Lebih Cepat daripada Tambah untuk Operasi Slice dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!