Maison >développement back-end >Golang >Équivalent Memset de Go : comment initialiser efficacement des tableaux avec des valeurs non nulles ?

Équivalent Memset de Go : comment initialiser efficacement des tableaux avec des valeurs non nulles ?

Barbara Streisand
Barbara Streisandoriginal
2025-01-04 02:29:40908parcourir

Go's Memset Equivalent: How to Efficiently Initialize Arrays with Non-Zero Values?

Go Analog pour Memset

Question :

Les programmeurs Go recherchent une méthode efficace analogue à Le memset de C pour initialiser des tableaux avec des valeurs non nulles, comme les boucles de base peuvent l'être lent.

Réponse :

Bien que Go ne dispose pas d'une fonction memset explicite, il existe des approches optimisées qui émulent sa fonctionnalité.

Boucle- Solution basée :

L'alternative la plus simple est une boucle qui parcourt le tableau, attribuant le valeur souhaitée pour chaque élément :

func memsetLoop(a []int, v int) {
    for i := range a {
        a[i] = v
    }
}

Solution basée sur la copie :

La fonction copy() optimisée de Go peut être exploitée pour initialiser rapidement les tableaux. En définissant manuellement le premier élément et en copiant à plusieurs reprises la partie remplie, le nombre d'itérations est réduit à log(n):

func memsetRepeat(a []int, v int) {
    if len(a) == 0 {
        return
    }
    a[0] = v
    for bp := 1; bp < len(a); bp *= 2 {
        copy(a[bp:], a[:bp])
    }
}

Comparaison des performances :

Pour petits tableaux, la solution basée sur la boucle est légèrement plus rapide. Cependant, à mesure que la taille du tableau augmente, la solution basée sur la copie devient nettement plus rapide en raison de son nombre réduit d'itérations.

Résultats de référence :

Array Size Loop-Based Copy-Based
100 elements 1.15x slower
1,000 elements 2.5x slower
10,000 elements 2x slower
100,000 elements 1.5x slower

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