Maison >développement back-end >Golang >Comment puis-je initialiser efficacement des tableaux dans Go, de la même manière que le memset de C ?

Comment puis-je initialiser efficacement des tableaux dans Go, de la même manière que le memset de C ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-25 20:03:11284parcourir

How Can I Efficiently Initialize Arrays in Go, Similar to C  's memset?

Existe-t-il un équivalent de memset en Go ?

En C , la fonction memset permet l'initialisation efficace de tableaux avec des valeurs spécifiques. En Go, bien qu'il n'y ait pas d'équivalent direct, plusieurs techniques peuvent obtenir des résultats similaires.

Itération de boucle

L'approche la plus simple consiste à utiliser une boucle pour définir chaque élément de un tableau à la valeur souhaitée.

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

Répété copy()

En profitant de la fonction copy() hautement optimisée, nous pouvons exploiter un modèle de copie répétée pour définir efficacement les valeurs du tableau.

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])
    }
}

Résultats de l'analyse comparative

Pour évaluer les performances de ces techniques, nous les comparons les unes aux autres pour différents tableaux tailles.

var a = make([]int, 1000) // Size will vary

func BenchmarkLoop(b *testing.B) {
    for i := 0; i < b.N; i++ {
        memsetLoop(a, 10)
    }
}

func BenchmarkRepeat(b *testing.B) {
    for i := 0; i < b.N; i++ {
        memsetRepeat(a, 11)
    }
}

Les résultats montrent que memsetRepeat() surpasse memsetLoop() pour les tableaux plus grands, démontrant son efficacité pour une initialisation rapide.

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