Go 的sync.pool 可以用于数组/切片吗?

Caz*_*tor 1 arrays pool go slice

我想知道是否可以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--
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑:这是 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--
    }
}
Run Code Online (Sandbox Code Playgroud)

归还它。

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
}
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 5

我想知道是否可以sync.Pool与数组或切片一起使用?

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

一个用例,引用其文档:

一个很好使用 Pool 的例子是 fmt 包,它维护一个动态大小的临时输出缓冲区存储。存储在负载下扩展(当许多 goroutine 正在积极打印时)并在静态时收缩。

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

另一方面,切片是“好的”标头,指向后备数组。因此传递/获取切片意味着仅传递/获取此标头。使用切片,您很可能会体验到性能的提升。基准!

请参阅相关内容:golang 切片是否按值传递?