Maison > développement back-end > Golang > Pourquoi `map[string]string` et `map[string]bool` affichent-ils une utilisation de la mémoire similaire dans Go ?

Pourquoi `map[string]string` et `map[string]bool` affichent-ils une utilisation de la mémoire similaire dans Go ?

Mary-Kate Olsen
Libérer: 2024-12-18 02:17:11
original
440 Les gens l'ont consulté

Why Does `map[string]string` and `map[string]bool` Show Similar Memory Usage in Go?

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
}
Copier après la connexion

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))
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal