Rumah > pembangunan bahagian belakang > Golang > Adakah Tugasan Terus Lebih Cepat daripada Tambah untuk Operasi Slice dalam Go?

Adakah Tugasan Terus Lebih Cepat daripada Tambah untuk Operasi Slice dalam Go?

DDD
Lepaskan: 2024-11-10 06:41:02
asal
761 orang telah melayarinya

Is Direct Assignment Faster than Append for Slice Operations in Go?

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

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

Mengapa Tugasan Lebih Cepat daripada Append?

Perbezaan prestasi berpunca daripada operasi berbeza yang dilakukan oleh setiap kaedah:

  • Tugasan Langsung (a[i] = i): Ini hanya menetapkan nilai elemen keping ke i.
  • Tambah (a = tambah(a, i)): Fungsi ini melibatkan proses yang lebih kompleks:

    1. Memanggil fungsi tambah terbina dalam, mencipta pengepala kepingan baharu dan kepingan sementara untuk parameter variadik.
    2. Mengiris semula yang sedia ada slice jika ia mempunyai kapasiti yang mencukupi.
    3. Menetapkan i kepada elemen terakhir kepingan baharu.
    4. Mengemas kini pembolehubah setempat a untuk merujuk kepingan baharu.

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!

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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan