Maison > développement back-end > Golang > L'attribution de tranches est-elle toujours plus rapide que l'ajout de tranches en Go ?

L'attribution de tranches est-elle toujours plus rapide que l'ajout de tranches en Go ?

Linda Hamilton
Libérer: 2024-11-12 10:19:02
original
956 Les gens l'ont consulté

Is Slice Assignment Always Faster Than Slice Append in Go?

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
    }
}
Copier après la connexion

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
Copier après la connexion

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 :

  1. Copier l'en-tête de la tranche existante
  2. Créer une tranche temporaire pour le paramètre variadique
  3. Redimensionner la tranche existante si nécessaire
  4. Attribuer la nouvelle valeur à un élément de la tranche
  5. Renvoi d'une nouvelle tranche, qui est ensuite affectée à la variable locale

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal