Maison >développement back-end >Golang >Comment calculer avec précision l'empreinte mémoire d'une Go Map ?

Comment calculer avec précision l'empreinte mémoire d'une Go Map ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-11 21:23:10264parcourir

How to Accurately Calculate the Memory Footprint of a Go Map?

Calcul de l'empreinte mémoire d'une carte dans Go

Déterminer la consommation de mémoire d'une carte est essentiel pour la gestion et l'optimisation des ressources. Cependant, calculer la longueur en octets d'une carte dans Go n'est pas une tâche simple.

Le package "encoding/binary" de Go fournit la fonction Size pour calculer l'empreinte mémoire des tranches et des "valeurs fixes", mais il le fait. ne prend pas en charge les cartes. Déduire manuellement le type et la taille des paires clé-valeur dans la carte serait fastidieux et potentiellement inexact.

Explorer la structure de la carte

La solution réside dans la compréhension du structure interne d'une carte. Une carte Go est représentée par un en-tête (hmap) suivi d'un tableau de buckets (bmap). Le hmap contient des informations essentielles telles que le nombre de cellules vivantes (taille de la carte), les graines de hachage et le nombre de seaux.

Calcul de l'empreinte mémoire de la carte

La mémoire L'empreinte d'une carte peut être calculée comme suit :

  1. Taille de l'en-tête hmap : unsafe.Sizeof(hmap)
  2. Mémoire consommée par les clés : len(map) * 8
  3. Mémoire consommée par les valeurs : len(map) 8 unsafe.Sizeof(value_type )
  4. Surcharge de mémoire pour les buckets : len(map) 8 unsafe.Sizeof(key_type)

Exemple de code

Le code suivant illustre le calcul de l'empreinte mémoire d'une carte :

import (
    "fmt"
    "unsafe"
)

type MyMap map[string]int

func main() {
    m := MyMap{"key1": 1, "key2": 2}

    keySize := unsafe.Sizeof(string("key1"))
    valueSize := unsafe.Sizeof(1)
    headerSize := unsafe.Sizeof(hmap{})
    numKeys := len(m)

    memoryFootprint := headerSize + (numKeys * 8) + (numKeys * 8 * valueSize) + (numKeys * 8 * keySize)

    fmt.Printf("Memory footprint of the map: %d bytes\n", memoryFootprint)
}

Ce code calcule efficacement l'empreinte mémoire de MyMap, y compris l'en-tête, les clés, les valeurs et le compartiment frais généraux.

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