Lors de l'optimisation du code à l'aide d'une chaîne map[string] avec seulement deux valeurs possibles ("A" ou "B"), la réduire à un map[string]bool semble être une amélioration évidente des performances. Cependant, les tests révèlent une observation surprenante : l'utilisation de la mémoire d'une chaîne longue ("a2") n'est pas différente d'une chaîne à un seul caractère ("a").
Pour comprendre ce comportement, il est important de noter que unsafe.Sizeof() ne prend pas en compte la taille des structures de données référencées. Au lieu de cela, il signale uniquement la taille « peu profonde » de la valeur transmise.
Dans Go, les cartes sont des pointeurs vers une structure de données. L'appel de unsafe.Sizeof(somemap) renvoie la taille de ce pointeur, et non la mémoire réelle utilisée par les éléments de la carte.
De même, les chaînes dans Go sont représentées par des en-têtes qui contiennent un pointeur et une longueur. L'appel de unsafe.Sizeof(somestring) renverra la taille de cet en-tête, qui est indépendante de la longueur de la chaîne.
La mémoire réelle requise pour stocker une valeur de chaîne en mémoire est égal à la longueur de sa séquence d'octets codée en UTF-8 plus la taille de son en-tête. Pour calculer cela, vous pouvez utiliser la formule suivante :
stringSize = len(str) + int(unsafe.Sizeof(str))
Il est également important de se rappeler que le découpage de chaînes crée un nouvel en-tête pointant vers le tableau de support du chaîne originale. Cela signifie que même si la chaîne découpée (s2) est petite, l'intégralité du tableau de sauvegarde de la ou des chaînes d'origine sera toujours conservée en mémoire.
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!