gpt4 book ai didi

arrays - Go 的 sync.pool 可以用于数组/slice 吗?

转载 作者:数据小太阳 更新时间:2023-10-29 03:31:18 26 4
gpt4 key购买 nike

我想知道是否可以将 sync.Pool 与数组或 slice 一起使用?例如,sync.Pool 是否可以在每秒处理数万个请求时加快以下速度?这个例子只是为了更好地理解 Go。

// Handler that uses GenerateArray
func ok(w http.ResponseWriter, r *http.Request) {
var res [100000]uint64
fibonacci.GenerateArray(&res)
fmt.Fprintf(w, "OK")
}

func GenerateArray(data *[100000]uint64) {
var start uint16 = 1000
var counter uint32
for start >= 1 {
var num = 90
var n1, n2, temp uint64 = 0, 1, 0

for num >= 1 {
temp = n2
n1, n2 = temp, n1+n2
data[counter] = n2
counter++
num--
}
start--
}
}

编辑:这是 Icza 建议的 slice 版本。希望我在学习时做对了。

res := make([]uint64, 100000)
fibonacci.GenerateSlice(res)

// PopulateSlice does this...
func PopulateSlice(data []uint64) {
var start uint16 = 1000
var counter uint32
for start >= 1 {
var num = 90
var n1, n2, temp uint64 = 0, 1, 0

for num >= 1 {
temp = n2
n1, n2 = temp, n1+n2
data[counter] = n2
counter++
num--
}
start--
}
}

返回它。

func GenerateSlice() []uint64 {
data := make([]uint64, 0, 100000)
var start uint16 = 1000
var counter uint32
for start >= 1 {
var num = 90
var n1, n2, temp uint64 = 0, 1, 0

for num >= 1 {
temp = n2
n1, n2 = temp, n1+n2
// data[counter] = n2
data = append(data, n2)
counter++
num--
}
start--
}
return data
}

最佳答案

I'm wondering if it's possible use sync.Pool with an array or slice?

是的,sync.Pool可以与任何 Go 值一起使用。

一个用例,引用自它的文档:

An example of good use of a Pool is in the fmt package, which maintains a dynamically-sized store of temporary output buffers. The store scales under load (when many goroutines are actively printing) and shrinks when quiescent.

但是,根据您的情况,它很可能不会带来性能提升。数组是“值”,所以当你传递一个数组时,它的值(它的所有元素)都会被复制。因此,如果您将一个数组放入池中,它将被复制。当您从池中获取数组时,它会再次被复制。这不是改进,而是损害。

另一方面, slice 是“漂亮”的 header ,指向后备数组。所以传递/获取 slice 意味着只传递/获取这个 header 。使用 slice ,您很可能会体验到性能提升。基准!

参见相关:Are golang slices passed by value?

关于arrays - Go 的 sync.pool 可以用于数组/slice 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57521479/

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