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
Mary-Kate Olsenoriginal
2024-12-18 02:17:11438parcourir

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
}

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!

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