Maison >développement back-end >Golang >Existe-t-il un Go rapide et efficace équivalent au memset de C ?
Existe-t-il un équivalent Go pour la fonction C memset ?
En C , memset permet l'initialisation d'un tableau avec une valeur spécifique . Cette fonction est particulièrement efficace. Dans Go, initialiser un tableau ou une tranche avec tous des zéros est simple en utilisant make([]int, 1000000); cependant, cela n'offre pas la possibilité d'initialiser avec des valeurs non nulles.
Bien qu'une boucle puisse être utilisée pour une initialisation manuelle, elle n'a pas l'efficacité de memset.
Analogues de memset en Go :
1. Approche basée sur la boucle :
func memsetLoop(a []int, v int) { for i := range a { a[i] = v } }
2. Approche basée sur copy() (recommandée) :
La fonction copy() est hautement optimisée et peut être utilisée pour des opérations de type memset.
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]) } }
Cette solution définit le premier élément manuellement et copie les parties déjà définies dans les parties non définies à l'aide de copy(). L'algorithme utilise une approche de doublement pour réduire le nombre d'itérations à log(n).
Benchmarking :
Benchmarking memsetRepeat() par rapport à memsetLoop() montre une performance notable avantage pour memsetRepeat() à mesure que le nombre d'éléments augmente, notamment autour de 3800-4000 éléments.
Remarque supplémentaire :
Pour les petites tranches, memsetLoop() peut fonctionner légèrement mieux. Cependant, memsetRepeat() offre des performances nettement meilleures pour les tranches plus grandes.
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!