Bagian ini memberikan pedoman pengkodean dari perspektif pengkodean Golang yang berguna untuk meningkatkan kinerja.
Lebih memilih strconv daripada fmt
Ketika mengonversi tipe data primitif menjadi string atau sebaliknya, strconv
lebih cepat daripada fmt
.
Tidak disarankan:
for i := 0; i < b.N; i++ {
s := fmt.Sprint(rand.Int())
}
Disarankan:
for i := 0; i < b.N; i++ {
s := strconv.Itoa(rand.Int())
}
Hindari mengonversi string ke byte
Hindari membuat ulang slice byte dari sebuah string yang tetap. Sebaliknya, lakukan konversi sekali dan tangkap hasilnya. Tidak disarankan:
for i := 0; i < b.N; i++ {
w.Write([]byte("Hello world"))
}
Disarankan:
data := []byte("Hello world")
for i := 0; i < b.N; i++ {
w.Write(data)
}
Tentukan kapasitas wadah
Tentukan kapasitas wadah jika memungkinkan untuk mengalokasikan memori wadah sebelumnya. Ini meminimalkan alokasi selanjutnya (dengan menyalin dan meresize wadah) saat menambahkan elemen.
Petunjuk kapasitas peta
Dalam kebanyakan kasus, berikan informasi kapasitas saat menginisialisasi dengan make()
.
make(map[T1]T2, petunjuk)
Memberikan petunjuk kapasitas kepada make()
akan mencoba untuk meresize peta saat inisialisasi, mengurangi alokasi memori saat menambahkan elemen ke peta.
Perhatikan bahwa, tidak seperti slice, petunjuk kapasitas peta tidak menjamin alokasi lengkap, tetapi digunakan untuk memperkirakan jumlah bucket hashmap yang diperlukan. Oleh karena itu, alokasi masih mungkin terjadi saat menambahkan elemen ke peta, bahkan ketika menyebutkan kapasitas peta.
Tidak disarankan:
m := make(map[string]os.FileInfo)
files, _ := os.ReadDir("./files")
for _, f := range files {
m[f.Name()] = f
}
// m dibuat tanpa petunjuk ukuran; mungkin ada lebih banyak alokasi saat runtime.
Disarankan:
files, _ := os.ReadDir("./files")
m := make(map[string]os.FileInfo, len(files))
for _, f := range files {
m[f.Name()] = f
}
// m dibuat dengan petunjuk ukuran; mungkin ada lebih sedikit alokasi saat runtime.
Tentukan kapasitas slice
Dalam kebanyakan kasus, berikan informasi kapasitas saat menginisialisasi sebuah slice dengan make()
, terutama saat menambahkan ke slice.
make([]T, panjang, kapasitas)
Tidak seperti peta, kapasitas slice bukan hanya petunjuk: kompiler akan mengalokasikan memori yang cukup untuk kapasitas slice yang diberikan dalam make()
, artinya operasi append()
selanjutnya akan menghasilkan nol alokasi (sampai panjang slice sama dengan kapasitasnya, setelah itu setiap append dapat meresize untuk menampung elemen tambahan).
Tidak disarankan:
for n := 0; n < b.N; n++ {
data := make([]int, 0)
for k := 0; k < size; k++{
data = append(data, k)
}
}
Disarankan:
for n := 0; n < b.N; n++ {
data := make([]int, 0, size)
for k := 0; k < size; k++{
data = append(data, k)
}
}