Maison  >  Article  >  développement back-end  >  L'affectation directe est-elle plus rapide que l'ajout pour les opérations de tranche en Go ?

L'affectation directe est-elle plus rapide que l'ajout pour les opérations de tranche en Go ?

DDD
DDDoriginal
2024-11-10 06:41:02697parcourir

Is Direct Assignment Faster than Append for Slice Operations in Go?

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 :

  • Assignation directe (a[i] = i ): Ceci définit simplement la valeur du ième élément de la tranche sur i.
  • Append (a = append(a, i)): Cette fonction implique un processus plus complexe :

    1. Appelle la fonction d'ajout intégrée, créant un nouvel en-tête de tranche et une tranche temporaire pour le paramètre variadique.
    2. Redécoupe la tranche existante si elle en a suffisamment capacité.
    3. Attribue i au dernier élément de la nouvelle tranche.
    4. Mise à jour la variable locale a pour référencer la nouvelle tranche.

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!

Déclaration:
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