Comparaison des performances : Slice Append vs Assign in Go
Lorsque vous travaillez avec des tranches dans Go, des opérations telles que l'ajout et l'attribution d'éléments peuvent avoir un impact significatif conséquences sur les performances. Deux méthodes courantes pour l'ajout de tranche sont disponibles :
append(slice, value) : Cette fonction crée une nouvelle tranche avec une capacité étendue pour accueillir le nouvel élément et copie les éléments existants dans le nouvelle tranche.
slice[index] = value : Cette affectation modifie directement l'élément à l'index spécifié de la tranche sans créer de nouvelle copie.
Pour comparer la performances de ces deux approches, les deux fonctions de référence suivantes ont été créées :
func BenchmarkSliceAppend(b *testing.B) { a := make([]int, 0, b.N) for i := 0; i < b.N; i++ { a = append(a, i) } } func BenchmarkSliceSet(b *testing.B) { a := make([]int, b.N) for i := 0; i < b.N; i++ { a[i] = i } }
Les résultats montrent que slice[index] = value est nettement plus rapide que append(slice, value) :
BenchmarkSliceAppend-4 200000000 7.87 ns/op 8 B/op 0 allocs/op BenchmarkSliceSet-4 300000000 5.76 ns/op 8 B/op
Comprendre la différence de performances
Pourquoi l'affectation de tranche est-elle plus rapide que l'ajout de tranche ? La principale différence réside dans le fait que l'affectation est une simple opération sur place qui modifie la tranche existante sans nécessiter de copies ni de réallocation.
D'autre part, la fonction d'ajout implique plusieurs étapes :
Même si certaines de ces étapes sont optimisées ou intégrées, la nécessité de mettre à jour la variable de tranche locale dans chaque itération de boucle ajoute une surcharge de calcul par rapport à l'opération d'affectation plus simple.
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!