Utilisation de la mémoire de chaîne dans Golang
Lors de l'optimisation d'un code à l'aide d'une chaîne map[string] avec des valeurs uniquement "A" ou "B ", l'hypothèse pourrait être qu'un map[string]bool serait plus efficace en raison de son type de valeur plus petit. Cependant, les tests révèlent que l'utilisation de la mémoire pour les deux cartes est étonnamment la même.
Comprendre unsafe.Sizeof()
Pour enquêter sur cela, unsafe.Sizeof() est utilisé pour mesurer l’utilisation de la mémoire. Cependant, il est essentiel de noter que unsafe.Sizeof() ne signale que la taille « faible » des données. Dans le cas des cartes, Go les implémente à l'aide de pointeurs. Par conséquent, unsafe.Sizeof(somemap) indique la taille du pointeur, pas les données de la carte entière.
Représentation de la mémoire de chaîne
Les chaînes dans Go sont représentées par un en-tête composé d’un pointeur vers des données et d’une longueur. Le type reflex.StringHeader définit cette structure :
type StringHeader struct { Data uintptr Len int }
Ainsi, unsafe.Sizeof(somemap) ne rapportera que la taille de cet en-tête, qui est indépendante de la valeur de la chaîne.
Exigences de mémoire réelles pour les cartes
Pour obtenir l'utilisation réelle de la mémoire pour les cartes, il est important de prendre en compte la données auxquelles ils font référence. En d'autres termes, len(str) int(unsafe.Sizeof(str)) fournit une estimation plus précise.
Considérations supplémentaires
Strings dans Go store UTF-8 séquences d'octets en mémoire. La fonction len() indique la longueur en octets, de sorte que l'utilisation réelle de la mémoire pour une chaîne peut être approximative par :
stringSize := len(str) + int(unsafe.Sizeof(str))
Il est également crucial de se rappeler que le découpage d'une chaîne existante alloue un nouveau tableau de support pour la tranche. . Même si la chaîne d'origine n'est plus référencée, le tableau de sauvegarde restera en mémoire pour prendre en charge la tranche.
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!