<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
go 如果頻繁地建立、銷燬物件(比如 http 服務的 json 物件,紀錄檔內容等),會對 GC 造成壓力。比如下面的 Log
函數,在高並行情況下,需要頻繁地建立和銷燬 buffer。
func Log(w io.Writer, key, val string) { b := new(bytes.Buffer) // 按一定的格式列印紀錄檔,這一段不是重點 b.WriteString(time.Now().UTC().Format(time.RFC3339)) b.WriteByte(' ') b.WriteString(key) b.WriteByte('=') b.WriteString(val) b.WriteByte('n') w.Write(b.Bytes()) }
這時候可以考慮複用這些 buffer。我們可以維護一個 buffer 的物件池,需要的時候從物件池拿 buffer,用完放回物件池。這時候就推薦使用 sync.Pool 了。
sync.Pool 維護著一組物件池,需要時從物件池拿物件,不需要放回物件池就可以了。它有這些特點:
初始化時指定 New 方法。sync.Pool 會通過 New 方法建立物件池的物件。一般返回一個指標。
// 從物件池裡取 buffer 時,如果池裡沒 buffer了,則呼叫 New 建立一個新的。 var bufPool = sync.Pool{ New: func() interface{} { return new(bytes.Buffer) }, }
通過 Get 獲取物件池的物件。當使用完畢,通過 Put 把物件返回物件池。
b := bufPool.Get().(*bytes.Buffer) // 從物件池拿 buffer 物件 // 操作物件,這個不重要 b.Reset() b.WriteString(time.Now().UTC().Format(time.RFC3339)) // 操作完放回物件池 bufPool.Put(b)
Log 函數可以使用 sync.Pool 的優化,程式碼如下:
var bufPool = sync.Pool{ New: func() interface{} { return new(bytes.Buffer) }, } func LogWithPool(w io.Writer, key, val string) { // 從物件池拿 buffer b := bufPool.Get().(*bytes.Buffer) b.Reset() // 按一定的格式列印紀錄檔,這一段不是重點 b.WriteString(time.Now().UTC().Format(time.RFC3339)) b.WriteByte(' ') b.WriteString(key) b.WriteByte('=') b.WriteString(val) b.WriteByte('n') w.Write(b.Bytes()) // 放回物件池 bufPool.Put(b) }
我們對兩個函數進行效能測試
// 不使用 sync.Pool func BenchmarkLog(b *testing.B) { writer := os.NewFile(0, os.DevNull) for n := 0; n < b.N; n++ { Log(writer, "path", "/search?a=flowers") } } // 使用 sync.Pool 複用 func BenchmarkLogWithPool(b *testing.B) { writer := os.NewFile(0, os.DevNull) for n := 0; n < b.N; n++ { LogWithPool(writer, "path", "/search?a=flowers") } }
結果:
> go test -bench . -benchmem
goos: darwin
goarch: amd64
pkg: example/pool
cpu: Intel(R) Core(TM) i5-1038NG7 CPU @ 2.00GHz
BenchmarkLog-8 1849365 635.0 ns/op 112 B/op 2 allocs/op
BenchmarkLogWithPool-8 1993304 614.4 ns/op 48 B/op 1 allocs/op
PASS
ok example/pool 4.333s
相比之下,使用 Sync.Pool 和不使用的時候,記憶體的使用比為 48:112,優化效果還是挺明顯的。
參考:
[1]. pkg.go.dev/sync#Pool
以上就是Go程式設計庫Sync.Pool用法範例詳解的詳細內容,更多關於Go庫Sync.Pool的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45