gpt4 book ai didi

pointers - 为什么将指针传递给 channel 速度较慢

转载 作者:IT王子 更新时间:2023-10-29 01:17:41 26 4
gpt4 key购买 nike

我是 golang 的新手,正在尝试用 golang 重写我的 java server 项目。

我发现,与传递值相比,将指针传递到 channel 会导致性能下降近 30%。

这是一个示例片段: 包主 进口 ( “时间” “调频” )

var c = make(chan t, 1024)
// var c = make(chan *t, 1024)
type t struct {
a uint
b uint
}

func main() {

start := time.Now()
for i := 0; i < 1000; i++ {
b := t{a:3, b:5}
// c <- &b
c <- b
}
elapsed := time.Since(start)
fmt.Println(t2)
}

更新。修复包丢失

最佳答案

作为一个值,它可以被栈分配:

go run -gcflags '-m' tmp.go
# command-line-arguments
./tmp.go:18: inlining call to time.Time.Nanosecond
./tmp.go:24: inlining call to time.Time.Nanosecond
./tmp.go:25: t2 escapes to heap
./tmp.go:25: main ... argument does not escape
63613

作为指针,它逃逸到堆中:

go run -gcflags '-m' tmp.go
# command-line-arguments
./tmp.go:18: inlining call to time.Time.Nanosecond
./tmp.go:24: inlining call to time.Time.Nanosecond
./tmp.go:21: &b escapes to heap <-- Additional GC pressure
./tmp.go:20: moved to heap: b <--
./tmp.go:25: t2 escapes to heap
./tmp.go:25: main ... argument does not escape
122513

转义到堆会引入一些开销/GC 压力。

再看汇编,指针版本还引入了额外的指令,包括:

go run -gcflags '-S' tmp.go
0x0055 00085 (...tmp.go:18) CALL runtime.newobject(SB)

在调用 runtime.chansend1 之前,非指针变体不会产生这种开销。

关于pointers - 为什么将指针传递给 channel 速度较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41178729/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com