Cette section fournit des directives de codage du point de vue du langage Golang qui sont bénéfiques pour améliorer les performances.
Préférer strconv à la place de fmt
Lors de la conversion de primitives en chaînes de caractères ou de chaînes de caractères en primitives, strconv
est plus rapide que fmt
.
Non recommandé:
for i := 0; i < b.N; i++ {
s := fmt.Sprint(rand.Int())
}
Recommandé:
for i := 0; i < b.N; i++ {
s := strconv.Itoa(rand.Int())
}
Éviter de convertir des chaînes en octets
Évitez de créer à plusieurs reprises une tranche d'octets à partir d'une chaîne fixe. Effectuez plutôt la conversion une fois et capturez le résultat.
Non recommandé:
for i := 0; i < b.N; i++ {
w.Write([]byte("Hello world"))
}
Recommandé:
data := []byte("Hello world")
for i := 0; i < b.N; i++ {
w.Write(data)
}
Spécifier la capacité du conteneur
Spécifiez la capacité du conteneur si possible pour préallouer de la mémoire pour le conteneur. Cela réduit les allocations ultérieures (en copiant et en redimensionnant le conteneur) lors de l'ajout d'éléments.
Indication de capacité pour une carte
Dans la plupart des cas, fournissez des informations sur la capacité lors de l'initialisation avec make()
.
make(map[T1]T2, indication)
Fournir une indication de capacité à make()
tentera de redimensionner la carte à l'initialisation, réduisant la réallocation de mémoire lors de l'ajout d'éléments à la carte.
Notez que, contrairement aux tranches, une indication de capacité de carte ne garantit pas une préallocation complète, mais est utilisée pour estimer le nombre de buckets hashmap requis. Par conséquent, une allocation peut encore se produire lors de l'ajout d'éléments à la carte, même en spécifiant la capacité de la carte.
Non recommandé:
m := make(map[string]os.FileInfo)
files, _ := os.ReadDir("./files")
for _, f := range files {
m[f.Name()] = f
}
// m est créé sans indication de taille ; il peut y avoir plus d'allocations à l'exécution.
Recommandé:
files, _ := os.ReadDir("./files")
m := make(map[string]os.FileInfo, len(files))
for _, f := range files {
m[f.Name()] = f
}
// m est créé avec une indication de taille ; il peut y avoir moins d'allocations à l'exécution.
Spécifier la capacité de la tranche
Dans la plupart des cas, fournissez des informations sur la capacité lors de l'initialisation d'une tranche avec make()
, en particulier lors de l'ajout à la tranche.
make([]T, longueur, capacité)
Contrairement aux cartes, la capacité d'une tranche n'est pas seulement une indication : le compilateur allouera suffisamment de mémoire pour la capacité de tranche fournie dans make()
, ce qui signifie que les opérations append()
ultérieures ne donneront lieu à aucune allocation (jusqu'à ce que la longueur de la tranche corresponde à sa capacité, après quoi tout append peut redimensionner pour accueillir des éléments supplémentaires).
Non recommandé:
for n := 0; n < b.N; n++ {
data := make([]int, 0)
for k := 0; k < size; k++{
data = append(data, k)
}
}
Recommandé:
for n := 0; n < b.N; n++ {
data := make([]int, 0, size)
for k := 0; k < size; k++{
data = append(data, k)
}
}