Adakah Slice Assignment Sentiasa Lebih Cepat Daripada Slice Append in Go?

Linda Hamilton
Lepaskan: 2024-11-12 10:19:02
asal
931 orang telah melayarinya

Is Slice Assignment Always Faster Than Slice Append in Go?

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
    }
}
Salin selepas log masuk

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
Salin selepas log masuk

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:

  1. Menyalin pengepala kepingan sedia ada
  2. Mencipta kepingan sementara untuk variadic parameter
  3. Mengiris semula kepingan sedia ada jika perlu
  4. Menetapkan nilai baharu kepada elemen kepingan
  5. Mengembalikan kepingan baharu, yang kemudiannya diberikan kepada pembolehubah setempat

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan