Bu bölüm, performansı artırmak için Golang kodlama perspektifinden kodlama yönergeleri sunmaktadır.

fmt yerine strconv tercih edin

Primitive tipleri stringlere veya stringleri primitive tiplere dönüştürürken, strconv, fmt'den daha hızlıdır.

Tavsiye edilmez:

for i := 0; i < b.N; i++ {
  s := fmt.Sprint(rand.Int())
}

Tavsiye edilen:

for i := 0; i < b.N; i++ {
  s := strconv.Itoa(rand.Int())
}

Stringleri byte'lara dönüştürmeyin

Sabit bir stringden tekrar tekrar bir byte dizisi oluşturmayın. Bunun yerine bir kez dönüştürme yapın ve sonucu yakalayın.

Tavsiye edilmez:

for i := 0; i < b.N; i++ {
  w.Write([]byte("Merhaba dünya"))
}

Tavsiye edilen:

data := []byte("Merhaba dünya")
for i := 0; i < b.N; i++ {
  w.Write(data)
}

Container kapasitesini belirtin

Eğer mümkünse, container kapasitesini belirtin. Bu, eleman eklerken daha sonraki atamalarda (container'ın kopyalanması ve boyutlandırılması) hafıza tahsisini asgariye indirir.

Map kapasite ipucu

Çoğu durumda, make() ile başlatılırken kapasite bilgisi sağlayın.

make(map[T1]T2, ipucu)

make()'e kapasite ipucu sağlamak, elemanları haritaya eklerken hafıza yeniden tahsisini azaltmaya çalışır.

Dikkat edin, dilimlere benzemez, bir harita kapasite ipucu tam bir öntahsiste garanti etmez, ancak tahmin edilmesi gereken hashmap kovası sayısını belirtmek için kullanılır. Bu nedenle, haritaya eleman eklerken bile tahsisat gerçekleşebilir, özellikle harita kapasitesi belirtildiğinde.

Tavsiye edilmez:

m := make(map[string]os.FileInfo)

files, _ := os.ReadDir("./dosyalar")
for _, f := range files {
    m[f.Name()] = f
}

// m boyutsuz oluşturuldu; çalışma zamanında daha fazla tahsisat olabilir.

Tavsiye edilen:

files, _ := os.ReadDir("./dosyalar")

m := make(map[string]os.FileInfo, len(files))
for _, f := range files {
    m[f.Name()] = f
}

// m boyut ipucuyla oluşturuldu; çalışma zamanında daha az tahsisat olabilir.

Dilim kapasitesini belirtin

Genellikle make() ile bir dilimi başlatırken kapasite bilgisi sağlayın, özellikle dilime eleman eklenecekse.

make([]T, uzunluk, kapasite)

Haritaların aksine, dilim kapasitesi sadece bir ipucu değildir: derleyici, make() içerisinde sağlanan dilim kapasitesi için yeterli bellek ayıracaktır, bu da sonraki append() işlemlerinin sıfır tahsisatla sonuçlanacağı anlamına gelir (dizinin uzunluğu kapasitesine ulaştıktan sonra, herhangi bir ekleme ek elemanları karşılamak için yeniden boyutlandırılabilir).

Tavsiye edilmez:

for n := 0; n < b.N; n++ {
  data := make([]int, 0)
  for k := 0; k < boyut; k++{
    data = append(data, k)
  }
}

Tavsiye edilen:

for n := 0; n < b.N; n++ {
  data := make([]int, 0, boyut)
  for k := 0; k < boyut; k++{
    data = append(data, k)
  }
}