您好,登錄后才能下訂單哦!
這篇文章主要講解了“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) }, } }
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怎么使用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。