Go 如何计算复杂映射变量的内存大小

Go 如何计算复杂映射变量的内存大小,go,Go,我试图计算内存中变量EntryMap的大小 type Entry interface { A() string B() string C() time.Time D() int64 } type Entries []Entry type EntryMap map[string]Entries 到目前为止,我得到的是: hm = make(EntryMap) SizeInMem = 8 //Length of Empty HMap for key, value

我试图计算内存中变量EntryMap的大小

type Entry interface {
    A() string
    B() string
    C() time.Time
    D() int64
}

type Entries []Entry
type EntryMap map[string]Entries
到目前为止,我得到的是:

hm = make(EntryMap)
SizeInMem = 8 //Length of Empty HMap

for key, value := range hm {
    A = 8 // For each Key Value Assignment
    B = len(Key) + 1 // Size of key string var
    C = len(Entries) * unsafe.Sizeof(Entry) // Size of Entry object * len of slice
    SizeInMem += A+B+C
}

fmt.Println("Size in Memory &v", SizeInMem)


这是确定内存中变量大小的正确方法吗?

这不是一件可以及时计算的事情

但我为你们准备了测试场地

类型输入接口{ 一串 B弦 D int64 } 键入条目[]条目 键入EntryMap映射[字符串]项 func main{ 大小:=memcalcfunc{ /*把你的代码放在这里*/ var hm=makentrymap //例如,使用map、grow做一些事情 //将变量传递到此函数以进行测量 卡奇姆 } 印刷尺寸 }
这是否正确取决于你想测量什么。您是否仅尝试测量地图和条目切片的大小?或者您也想测量包含的条目吗?如果目标是同时测量所有包含条目的大小,那么可能没有简单易行的方法。每个条目可以是任意大小,从满足接口的0字节空结构到zettabytes(如果您有一些将所有人类知识保存在内存中的实现)。这还不是最复杂的部分。如果列表中有两个相同的实例,该怎么办?这应该算一次还是两次?更糟糕的是:如果两个实例共享其内存中表示的某些部分(如数据库句柄),会怎么样?这应该被计算一次还是两次?@Flimzy我试图计算内存中变量的大小,只计算条目的片段。不,这都是错误的。尤其是当您的代码不包含内部映射开销时,您根本不知道这一点。不管你想做什么,都会有问题吗?重新设计。你根本不能。