Accélération des opérations d'ajout de tranches dans Go
Dans Go, les tranches sont des structures de données cruciales qui stockent des séquences de valeurs. Lors de l’ajout d’éléments à une tranche, il est essentiel d’optimiser les performances. Cet article explore la différence de performances entre deux méthodes d'ajout à une tranche : l'ajout et l'affectation directe (=).
Analyse de référence
Pour comparer les performances, nous avons exécuté deux tests utilisant le code suivant :
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 } }
Les résultats du test indiquent que l'affectation directe (a[i] = i) est nettement plus rapide que l'utilisation d'append :
BenchmarkSliceAppend-4 200000000 7.87 ns/op 8 B/op 0 allocs/op BenchmarkSliceSet-4 300000000 5.76 ns/op 8 B/op
Pourquoi l'affectation est-elle plus rapide que l'ajout ?
La différence de performances provient des opérations distinctes effectuées par chaque méthode :
Append (a = append(a, i)): Cette fonction implique un processus plus complexe :
En résumé, chaque opération d'ajout implique une surcharge supplémentaire dans la copie de l'en-tête de tranche et la création de tranches temporaires, alors que l'affectation directe modifie simplement l'élément de tranche existant. Cette surcharge contribue à la différence de performances observée.
Recommandation
Pour des performances optimales lors de l'ajout à des tranches, il est recommandé de pré-allouer une capacité suffisante à l'aide de make plutôt que d'utiliser à plusieurs reprises la fonction d'ajout. Cela élimine le besoin d’allocation dynamique de mémoire et de retranchage, améliorant considérablement l’efficacité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!