中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

GoLang?sync.Pool怎么使用

發布時間:2023-01-03 10:20:19 來源:億速云 閱讀:94 作者:iii 欄目:開發技術

這篇文章主要講解了“GoLang sync.Pool怎么使用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“GoLang sync.Pool怎么使用”吧!

    使用場景

    一句話總結:保存和復用臨時對象,減少內存分配,降低GC壓力

    sync.Pool是可伸縮的,也是并發安全的,其大小僅受限于內存大小。sync.Pool用于存儲那些被分配了但是沒有使用,而未來可能會使用的值。這樣就可以不用再次經過內存分配,可直接復用已有對象,減輕GC的壓力,從而提升系統性能。

    使用方法

    聲明對象池

    type Student struct {
       Name   string
       Age    int32
       Remark [1024]byte
    }
    func main() {
       var studentPool = sync.Pool{
          New: func() interface{} {
             return new(Student)
          },
       }
    }

    Get & Put

    type Student struct {
       Name   string
       Age    int32
       Remark [1024]byte
    }
    var buf, _ = json.Marshal(Student{Name: "lxy", Age: 18})
    func Unmarsh() {
       var studentPool = sync.Pool{
          New: func() interface{} {
             return new(Student)
          },
       }
       stu := studentPool.Get().(*Student)
       err := json.Unmarshal(buf, stu)
       if err != nil {
          return
       }
       studentPool.Put(stu)
    }
    • Get()用于從對象池中獲取對象,因為返回值是interface{},因此需要類型轉換

    • Put()則是在對象使用完畢之后,返回對象池

    性能測試

    以下是性能測試的代碼:

    package benchmem
    import (
       "encoding/json"
       "sync"
       "testing"
    )
    type Student struct {
       Name   string
       Age    int32
       Remark [1024]byte
    }
    var buf, _ = json.Marshal(Student{Name: "lxy", Age: 18})
    var studentPool = sync.Pool{
       New: func() interface{} {
          return new(Student)
       },
    }
    func BenchmarkUnmarshal(b *testing.B) {
       for n := 0; n < b.N; n++ {
          stu := &Student{}
          json.Unmarshal(buf, stu)
       }
    }
    func BenchmarkUnmarshalWithPool(b *testing.B) {
       for n := 0; n < b.N; n++ {
          stu := studentPool.Get().(*Student)
          json.Unmarshal(buf, stu)
          studentPool.Put(stu)
       }
    }

    輸入以下命令:

     go test -bench . -benchmem

    以下是性能測試的結果:

    goos: windows
    goarch: amd64                                      
    pkg: ginTest                                       
    cpu: 11th Gen Intel(R) Core(TM) i5-1135G7 @ 2.40GHz
    BenchmarkUnmarshal-8               17004             74103 ns/op            1392 B/op          8 allocs/op
    BenchmarkUnmarshalWithPool-8       17001             71173 ns/op             240 B/op          7 allocs/op
    PASS
    ok      ginTest 3.923s

    在這個例子中,因為 Student 結構體內存占用較小,內存分配幾乎不耗時間。而標準庫 json 反序列化時利用了反射,效率是比較低的,占據了大部分時間,因此兩種方式最終的執行時間幾乎沒什么變化。但是內存占用差了一個數量級,使用了 sync.Pool 后,內存占用僅為未使用的 240/1392 = 1/6,對 GC 的影響就很大了。我們甚至在fmt.Printf的源碼里面也使用了sync.Pool進行性能優化!

    感謝各位的閱讀,以上就是“GoLang sync.Pool怎么使用”的內容了,經過本文的學習后,相信大家對GoLang sync.Pool怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    莲花县| 合阳县| 彭泽县| 青海省| 连山| 阳东县| 封开县| 会昌县| 东丽区| 泸水县| 慈溪市| 墨竹工卡县| 江阴市| 金塔县| 高清| 永修县| 长泰县| 马山县| 麦盖提县| 庆元县| 荣成市| 伊川县| 德钦县| 德格县| 重庆市| 六盘水市| 青铜峡市| 施秉县| 湄潭县| 滁州市| 平山县| 永平县| 阳春市| 五寨县| 垫江县| 霍山县| 玛多县| 宁都县| 图木舒克市| 九龙坡区| 奎屯市|