在 golang 中声明一个空的 map[string]interface{} 内存 cost/overhead 是多少?
What's the memory cost/overhead of declaring one empty map[string]interface{} in golang?
出于好奇,来自 source code
type hmap struct {
count int // 1 word
flags uint8
B uint8
noverflow uint16
hash0 uint32 // = 8 byte
buckets unsafe.Pointer // 1 word
oldbuckets unsafe.Pointer // 1 word
nevacuate uintptr // 1 word
extra *mapextra // 1 word
}
所以至少:5 个字 + 8 个字节
但为什么 creation cost is 0? -
package main
import (
"fmt"
"runtime"
)
func main() {
var m1, m2 runtime.MemStats
var i byte
runtime.ReadMemStats(&m1)
mp := map[byte]byte{}
runtime.ReadMemStats(&m2)
fmt.Println("Bytes allocated on creation:", m2.Alloc-m1.Alloc)
for i = 0; i < 100; i++ {
runtime.ReadMemStats(&m1)
mp[i] = i
runtime.ReadMemStats(&m2)
fmt.Printf("Bytes allocated on assignment %d: %d\n", i, m2.Alloc-m1.Alloc)
}
}
游乐场:https://play.golang.org/p/iyYshDzexQt
输出:
Bytes allocated on creation: 0
why the creation cost is 0?
Go 堆栈分配在堆上分配零字节。
mp := map[byte]byte{}
main map[byte]byte literal does not escape
package main
import (
"fmt"
"runtime"
)
func main() {
var m1, m2 runtime.MemStats
var i byte
runtime.ReadMemStats(&m1)
mp := map[byte]byte{}
runtime.ReadMemStats(&m2)
fmt.Println("Bytes allocated on creation:", m2.Alloc-m1.Alloc)
for i = 0; i < 100; i++ {
runtime.ReadMemStats(&m1)
mp[i] = i
runtime.ReadMemStats(&m2)
fmt.Printf("Bytes allocated on assignment %d: %d\n", i, m2.Alloc-m1.Alloc)
}
}
游乐场:https://play.golang.org/p/iyYshDzexQt
输出:
Bytes allocated on creation: 0
出于好奇,来自 source code
type hmap struct {
count int // 1 word
flags uint8
B uint8
noverflow uint16
hash0 uint32 // = 8 byte
buckets unsafe.Pointer // 1 word
oldbuckets unsafe.Pointer // 1 word
nevacuate uintptr // 1 word
extra *mapextra // 1 word
}
所以至少:5 个字 + 8 个字节
但为什么 creation cost is 0? -
package main
import (
"fmt"
"runtime"
)
func main() {
var m1, m2 runtime.MemStats
var i byte
runtime.ReadMemStats(&m1)
mp := map[byte]byte{}
runtime.ReadMemStats(&m2)
fmt.Println("Bytes allocated on creation:", m2.Alloc-m1.Alloc)
for i = 0; i < 100; i++ {
runtime.ReadMemStats(&m1)
mp[i] = i
runtime.ReadMemStats(&m2)
fmt.Printf("Bytes allocated on assignment %d: %d\n", i, m2.Alloc-m1.Alloc)
}
}
游乐场:https://play.golang.org/p/iyYshDzexQt
输出:
Bytes allocated on creation: 0
why the creation cost is 0?
Go 堆栈分配在堆上分配零字节。
mp := map[byte]byte{}
main map[byte]byte literal does not escape
package main
import (
"fmt"
"runtime"
)
func main() {
var m1, m2 runtime.MemStats
var i byte
runtime.ReadMemStats(&m1)
mp := map[byte]byte{}
runtime.ReadMemStats(&m2)
fmt.Println("Bytes allocated on creation:", m2.Alloc-m1.Alloc)
for i = 0; i < 100; i++ {
runtime.ReadMemStats(&m1)
mp[i] = i
runtime.ReadMemStats(&m2)
fmt.Printf("Bytes allocated on assignment %d: %d\n", i, m2.Alloc-m1.Alloc)
}
}
游乐场:https://play.golang.org/p/iyYshDzexQt
输出:
Bytes allocated on creation: 0