我试图理解Go的一些内部。但有一件事我不能绕开,那就是goroutines的堆栈是如何增加的。
我看到去使用来分配新的堆栈,然后将其复制到新创建的区域。虽然,它与堆分配有何不同?runtime.morestack
更准确地说:为什么函数的工作速度比函数快十倍?stack()heap()
func stack() {
_ = stackit()
}
//go:noinline
func stackit() [8000]byte {
return [8000]byte{}
}
func heap() {
_ = heapit()
}
//go:noinline
func heapit() *[8000]byte {
a := [8000]byte{}
return &a
}
基准:
❯ go test -bench=. -benchmem
goos: darwin
goarch: amd64
cpu: Intel(R) Core(TM) i7-9750H CPU @ 2.60GHz
BenchmarkStackIt-12 11208864 103.9 ns/op 0 B/op 0 allocs/op
BenchmarkHeapIt-12 1309708 919.5 ns/op 8192 B/op 1 allocs/op
PASS
ok _/Users/asnelzin/dev/experiment/lstack 3.981s
如您所见,第一个函数中没有堆分配,但应放大 g.stack 以适合字节数组。
阿晨1998
相关分类