From 41a67ca012628eb8b1e02b00275cd905bb0e9fba Mon Sep 17 00:00:00 2001 From: wdvxdr Date: Wed, 17 Mar 2021 17:26:28 +0800 Subject: [PATCH] switch to buffer pool --- coolq/bot.go | 12 ++++++++---- global/buffer.go | 27 +++++++++++++++++++++++++++ 2 files changed, 35 insertions(+), 4 deletions(-) create mode 100644 global/buffer.go diff --git a/coolq/bot.go b/coolq/bot.go index 7c0366a..262c596 100644 --- a/coolq/bot.go +++ b/coolq/bot.go @@ -119,7 +119,8 @@ func (bot *CQBot) GetMessage(mid int32) MSG { m := MSG{} data, err := bot.db.Get(binary.ToBytes(mid), nil) if err == nil { - buff := new(bytes.Buffer) + buff := global.NewBuffer() + defer global.PutBuffer(buff) buff.Write(binary.GZipUncompress(data)) err = gob.NewDecoder(buff).Decode(&m) if err == nil { @@ -346,7 +347,8 @@ func (bot *CQBot) InsertGroupMessage(m *message.GroupMessage) int32 { } id := toGlobalID(m.GroupCode, m.Id) if bot.db != nil { - buf := new(bytes.Buffer) + buf := global.NewBuffer() + defer global.PutBuffer(buf) if err := gob.NewEncoder(buf).Encode(val); err != nil { log.Warnf("记录聊天数据时出现错误: %v", err) return -1 @@ -371,7 +373,8 @@ func (bot *CQBot) InsertPrivateMessage(m *message.PrivateMessage) int32 { } id := toGlobalID(m.Sender.Uin, m.Id) if bot.db != nil { - buf := new(bytes.Buffer) + buf := global.NewBuffer() + defer global.PutBuffer(buf) if err := gob.NewEncoder(buf).Encode(val); err != nil { log.Warnf("记录聊天数据时出现错误: %v", err) return -1 @@ -398,7 +401,8 @@ func (bot *CQBot) InsertTempMessage(target int64, m *message.TempMessage) int32 } id := toGlobalID(m.Sender.Uin, m.Id) if bot.db != nil { - buf := new(bytes.Buffer) + buf := global.NewBuffer() + defer global.PutBuffer(buf) if err := gob.NewEncoder(buf).Encode(val); err != nil { log.Warnf("记录聊天数据时出现错误: %v", err) return -1 diff --git a/global/buffer.go b/global/buffer.go new file mode 100644 index 0000000..41c7816 --- /dev/null +++ b/global/buffer.go @@ -0,0 +1,27 @@ +package global + +import ( + "bytes" + "sync" +) + +var bufferPool = sync.Pool{ + New: func() interface{} { + return new(bytes.Buffer) + }, +} + +// NewBuffer 从池钟获取新 bytes.Buffer +func NewBuffer() *bytes.Buffer { + return bufferPool.Get().(*bytes.Buffer) +} + +// PutBuffer 将 Buffer放入池中 +func PutBuffer(buf *bytes.Buffer) { + // See https://golang.org/issue/23199 + const maxSize = 1 << 16 + if buf.Cap() < maxSize { // 对于大Buffer直接丢弃 + buf.Reset() + bufferPool.Put(buf) + } +}