Golang Gws v1.4.5 版本更新:内存与IO性能优化
Golang Gws v1.4.5 版本更新:内存与IO性能优化 此次 gws 更新改进了 IO 方法,在 1000 个连接时峰值 IOPS 提升了约 37%,达到 gorilla/websocket 的 3 倍,并将内存消耗降低至与 gorilla/websocket 相同的水平。具体改进细节如下:
- 使用 io.Reader 替代 io.CopyN 读取数据,避免不必要的内存分配
- 使用 net.Buffers 替代 bufio.Writer 写入数据,减少内存拷贝
- 从连接中移除 bufio.Writer,并将 WriteBufferSize 参数标记为已弃用

更多关于Golang Gws v1.4.5 版本更新:内存与IO性能优化的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于Golang Gws v1.4.5 版本更新:内存与IO性能优化的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
// 示例:使用 gws v1.4.5 建立 WebSocket 连接并发送数据
package main
import (
"log"
"net/http"
"time"
"github.com/lxzan/gws"
)
func main() {
// 创建 WebSocket 服务器配置
upgrader := gws.NewUpgrader(&Handler{}, &gws.ServerOption{
// WriteBufferSize 参数已弃用,但为了兼容性暂时保留
WriteBufferSize: 1024,
})
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
// 升级 HTTP 连接为 WebSocket 连接
socket, err := upgrader.Upgrade(w, r)
if err != nil {
log.Println("Upgrade failed:", err)
return
}
go socket.ReadLoop() // 启动读循环
})
// 启动服务器
go func() {
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal("Server failed:", err)
}
}()
// 客户端连接示例
time.Sleep(time.Second)
client, _, err := gws.NewClient(&Handler{}, &gws.ClientOption{
Addr: "ws://localhost:8080/ws",
})
if err != nil {
log.Fatal("Client failed:", err)
}
go client.ReadLoop()
// 发送消息(利用 net.Buffers 优化写入)
if err := client.WriteMessage(gws.OpcodeText, []byte("Hello gws v1.4.5!")); err != nil {
log.Println("Write failed:", err)
}
select {}
}
// 实现 gws.Event 接口
type Handler struct{}
func (h *Handler) OnOpen(socket *gws.Conn) {
log.Println("Connection opened")
}
func (h *Handler) OnMessage(socket *gws.Conn, message *gws.Message) {
defer message.Close()
log.Printf("Received: %s", message.Data.String())
}
func (h *Handler) OnClose(socket *gws.Conn, err error) {
log.Println("Connection closed")
}
性能优化细节分析:
- io.Reader 替代 io.CopyN
// 旧版本可能使用 io.CopyN
io.CopyN(writer, reader, n) // 会产生额外内存分配
// 新版本直接使用 io.Reader
reader.Read(buf) // 减少内存分配
- net.Buffers 替代 bufio.Writer
// 新版本写入优化
var buffers net.Buffers
buffers = append(buffers, data1, data2)
buffers.WriteTo(conn) // 减少内存拷贝次数
- 移除 bufio.Writer
// 连接层不再包装 bufio.Writer
// 直接使用 net.Conn 的原始写入接口
conn.Write(data) // 降低内存开销
这些改进使得 gws 在 1000 个并发连接时,IOPS 达到 gorilla/websocket 的 3 倍,同时内存消耗与 gorilla/websocket 持平。

