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 参数标记为已弃用

image

仓库: github.com/lxzan/gws


更多关于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")
}

性能优化细节分析:

  1. io.Reader 替代 io.CopyN
// 旧版本可能使用 io.CopyN
io.CopyN(writer, reader, n) // 会产生额外内存分配

// 新版本直接使用 io.Reader
reader.Read(buf) // 减少内存分配
  1. net.Buffers 替代 bufio.Writer
// 新版本写入优化
var buffers net.Buffers
buffers = append(buffers, data1, data2)
buffers.WriteTo(conn) // 减少内存拷贝次数
  1. 移除 bufio.Writer
// 连接层不再包装 bufio.Writer
// 直接使用 net.Conn 的原始写入接口
conn.Write(data) // 降低内存开销

这些改进使得 gws 在 1000 个并发连接时,IOPS 达到 gorilla/websocket 的 3 倍,同时内存消耗与 gorilla/websocket 持平。

回到顶部