You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

84 lines
1.8 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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
},
}