|
|
package server
|
|
|
|
|
|
import (
|
|
|
"sync"
|
|
|
)
|
|
|
|
|
|
// 对象池(减少GC压力)
|
|
|
var (
|
|
|
// messagePool 消息缓冲区池
|
|
|
messagePool = sync.Pool{
|
|
|
New: func() interface{} {
|
|
|
return make([]byte, 0, 4096)
|
|
|
},
|
|
|
}
|
|
|
|
|
|
// messagesPool 消息列表池
|
|
|
messagesPool = sync.Pool{
|
|
|
New: func() interface{} {
|
|
|
return make([][]byte, 0, 4)
|
|
|
},
|
|
|
}
|
|
|
)
|
|
|
|
|
|
// getMessageBuffer 从池中获取消息缓冲区
|
|
|
func getMessageBuffer() []byte {
|
|
|
return messagePool.Get().([]byte)
|
|
|
}
|
|
|
|
|
|
// putMessageBuffer 将消息缓冲区放回池中
|
|
|
func putMessageBuffer(buf []byte) {
|
|
|
if buf == nil {
|
|
|
return
|
|
|
}
|
|
|
// 重置长度但保留容量
|
|
|
buf = buf[:0]
|
|
|
// 如果容量太大,不回收(避免池中积累大对象)
|
|
|
if cap(buf) > 64*1024 {
|
|
|
return
|
|
|
}
|
|
|
messagePool.Put(buf)
|
|
|
}
|
|
|
|
|
|
// getMessagesSlice 从池中获取消息列表
|
|
|
func getMessagesSlice() [][]byte {
|
|
|
return messagesPool.Get().([][]byte)
|
|
|
}
|
|
|
|
|
|
// putMessagesSlice 将消息列表放回池中
|
|
|
func putMessagesSlice(messages [][]byte) {
|
|
|
if messages == nil {
|
|
|
return
|
|
|
}
|
|
|
// 清空但保留容量
|
|
|
for i := range messages {
|
|
|
messages[i] = nil
|
|
|
}
|
|
|
messages = messages[:0]
|
|
|
// 如果容量太大,不回收
|
|
|
if cap(messages) > 64 {
|
|
|
return
|
|
|
}
|
|
|
messagesPool.Put(messages)
|
|
|
}
|
|
|
|
|
|
// requestPool Request对象池
|
|
|
var requestPool = sync.Pool{
|
|
|
New: func() interface{} {
|
|
|
// 注意:这里不能直接创建requestImpl,因为它是未导出的
|
|
|
// 对象池暂时不用于Request和Response,因为它们需要特定的初始化参数
|
|
|
// 如果需要使用对象池,需要修改request和response的创建方式
|
|
|
return nil
|
|
|
},
|
|
|
}
|
|
|
|
|
|
// responsePool Response对象池
|
|
|
var responsePool = sync.Pool{
|
|
|
New: func() interface{} {
|
|
|
// 注意:这里不能直接创建responseImpl,因为它是未导出的
|
|
|
// 对象池暂时不用于Request和Response,因为它们需要特定的初始化参数
|
|
|
return nil
|
|
|
},
|
|
|
}
|
|
|
|