我想知道是否可以在数组或切片中使用sync.Pool?例如,当每秒处理数以万计的请求时,sync.Pool是否能加快以下的速度?这个例子就是简单的理解更好。
// 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建议的切片版本。希望我在学习的时候做得对。
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
}发布于 2019-08-16 08:49:20
我想知道是否可以在数组或切片中使用
sync.Pool?
是的,sync.Pool可以与任何Go值一起使用。
引用其文档的用例:
一个很好地使用池的例子是fmt包,它维护一个动态大小的临时输出缓冲区存储。商店的规模在负荷下(当许多猩猩正在积极印刷),当静止时缩小。
但是,它很可能不会带来性能上的提高。数组是“值”,所以当您传递一个数组时,它的值(其所有元素)都会被复制。因此,如果要将数组放入池中,则会复制数组。当您从池中得到一个数组时,它将再次被复制。这不是一个进步,而是一种损害。
另一方面,切片是“很好”的标题,指向支持数组。因此,传递/获取切片意味着只是传递/获取这个标题。有了切片,您很可能会体验到性能提升。基准!
见related:Are golang slices passed by value?
https://stackoverflow.com/questions/57521479
复制相似问题