首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go的sync.pool可以用于数组/片吗?

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

Stack Overflow用户
提问于 2019-08-16 08:42:44
回答 1查看 3.6K关注 0票数 1

我想知道是否可以在数组或切片中使用sync.Pool?例如,当每秒处理数以万计的请求时,sync.Pool是否能加快以下的速度?这个例子就是简单的理解更好。

代码语言:javascript
复制
// 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建议的切片版本。希望我在学习的时候做得对。

代码语言:javascript
复制
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--
    }
}

还回去。

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

发布于 2019-08-16 08:49:20

我想知道是否可以在数组或切片中使用sync.Pool

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

引用其文档的用例:

一个很好地使用池的例子是fmt包,它维护一个动态大小的临时输出缓冲区存储。商店的规模在负荷下(当许多猩猩正在积极印刷),当静止时缩小。

但是,它很可能不会带来性能上的提高。数组是“值”,所以当您传递一个数组时,它的值(其所有元素)都会被复制。因此,如果要将数组放入池中,则会复制数组。当您从池中得到一个数组时,它将再次被复制。这不是一个进步,而是一种损害。

另一方面,切片是“很好”的标题,指向支持数组。因此,传递/获取切片意味着只是传递/获取这个标题。有了切片,您很可能会体验到性能提升。基准!

见related:Are golang slices passed by value?

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57521479

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档