我想知道是否可以将sync.Pool
与数组或切片一起使用?例如,每秒处理数万个请求时,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建议的切片版本。希望我在学习时做对了。
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
}
答案 0 :(得分:3)
我想知道是否可以将
sync.Pool
与数组或切片一起使用?
是的,sync.Pool
可以与任何Go值一起使用。
用例,引用其文档:
在fmt包中可以很好地利用Pool的示例,该包维护着动态大小的临时输出缓冲区存储。商店在负载下会缩放(当许多goroutine正在主动打印时),并且在静止时会缩小。
但是,您的情况很可能不会导致性能提高。数组是“值”,因此当您传递数组时,将复制它的值(所有元素)。因此,如果将数组放入池中,则会将其复制。当您从池中获取阵列时,它将再次被复制。这不是改善,而是有害。
另一方面,切片是“好的”标头,指向备用数组。因此,传递/获取切片意味着仅传递/获取此标头。使用切片,您可能会很好地提高性能。基准!