【发布时间】:2019-03-21 22:48:47
【问题描述】:
我正在使用 map[string]string 优化代码,其中地图的值只有“A”或“B”。所以我认为显然 map[string]bool 更好,因为地图包含大约 5000 万个元素。
var a = "a"
var a2 = "Why This ultra long string take the same amount of space in memory as 'a'"
var b = true
var c map[string]string
var d map[string]bool
c["t"] = "A"
d["t"] = true
fmt.Printf("a: %T, %d\n", a, unsafe.Sizeof(a))
fmt.Printf("a2: %T, %d\n", a2, unsafe.Sizeof(a2))
fmt.Printf("b: %T, %d\n", b, unsafe.Sizeof(b))
fmt.Printf("c: %T, %d\n", c, unsafe.Sizeof(c))
fmt.Printf("d: %T, %d\n", d, unsafe.Sizeof(d))
fmt.Printf("c: %T, %d\n", c, unsafe.Sizeof(c["t"]))
fmt.Printf("d: %T, %d\n", d, unsafe.Sizeof(d["t"]))
结果是:
a: string, 8
a2: string, 8
b: bool, 1
c: map[string]string, 4
d: map[string]bool, 4
c2: map[string]string, 8
d2: map[string]bool, 1
在测试时我发现了一些奇怪的东西,为什么 a2 和一个非常长的字符串使用 8 个字节,就像 a 只有一个字母?
【问题讨论】:
-
使用 go 的 profiler 优化程序。
-
通用且有用的规则:始终仔细阅读每个函数和每个包的官方文档。答案就在那里。