1 回答

TA貢獻1876條經驗 獲得超7個贊
嘗試使用顛覆編譯器只會使轉義分析更難完成其工作,從而阻止切片被堆棧分配。只需分配單個切片,并在每次循環迭代中重復使用它:unsafe.Pointer
func build(res [][]int, targets []int) {
buff := make([]int, 0, 6)
step := len(res) / len(targets)
for i := range targets {
buff = buff[:0]
for j := i * step; j < (i+1)*step; j++ {
res[j] = append(res[j], targets[i])
}
if len(targets) != 1 {
buff = append(buff, targets[:i]...)
buff = append(buff, targets[i+1:]...)
build(res[i*step:(i+1)*step], buff)
}
}
return
}
這可以通過編譯器正確優化
./main.go:26:17: make([]int, 0, 6) does not escape
并且只會導致所需的分配:
Benchmark-8 44607 26838 ns/op 52992 B/op 721 allocs/op
- 1 回答
- 0 關注
- 122 瀏覽
添加回答
舉報