当前位置: 首页 > news >正文

http及websocket性能对比 - liyan

场景

在服务端分别启动了http服务及websocket服务,返回所接受到的信息。构造BenchmarkHttpBenchmarkWS进行请求,发送递增字符串。

代码

// server.go/*golang中使用的是http1.1协议,默认为长链接。仅第一次发送请求时进行握手。
*/package mainimport ("flag""fmt""io""log""net/http""sync""github.com/gorilla/websocket"
)var ws_addr = flag.String("ws_addr", "localhost:9080", "websocket http service address")
var http_addr = flag.String("http_addr", "localhost:9090", "http address address")var upgrader = websocket.Upgrader{} // use default optionsfunc ws_echo(w http.ResponseWriter, r *http.Request) {c, err := upgrader.Upgrade(w, r, nil)if err != nil {log.Print("upgrade:", err)return}defer c.Close()for {mt, message, err := c.ReadMessage()if err != nil {log.Println("read:", err)break}log.Printf("recv: %s", message)err = c.WriteMessage(mt, message)if err != nil {log.Println("write:", err)break}}
}func http_echo(w http.ResponseWriter, req *http.Request) {req.ParseForm()echo_data := req.Form.Get("echo")fmt.Println(echo_data)io.WriteString(w, echo_data)return}func start_websocket() {http.HandleFunc("/ws_echo", ws_echo)log.Fatal(http.ListenAndServe(*ws_addr, nil))
}func start_http() {http.HandleFunc("/http_echo", http_echo)log.Fatal(http.ListenAndServe(*http_addr, nil))
}func main() {flag.Parse()log.SetFlags(0)wg := sync.WaitGroup{}wg.Add(2)go start_websocket()go start_http()wg.Wait()}
// web_test.go
package mainimport ("fmt""io/ioutil""net/http""net/url""strconv""testing""github.com/gorilla/websocket"
)func BenchmarkHttp(b *testing.B) {client := &http.Client{}for i := 0; i < b.N; i++ {i_str := strconv.Itoa(i)req, err := http.NewRequest(http.MethodGet, "http://localhost:9090/http_echo?echo="+i_str, nil)if err != nil {fmt.Println("create new request failed", err.Error())return}//b.ResetTimer()resp, err := client.Do(req)if err != nil {fmt.Println("got http request error", err.Error())return}_, _ = ioutil.ReadAll(resp.Body)//fmt.Println(string(body))}
}func BenchmarkWs(b *testing.B) {addr := "localhost:9080"u := url.URL{Scheme: "ws", Host: addr, Path: "/ws_echo"}c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)if err != nil {fmt.Println("Error, create websocket connect failed")return}for i := 0; i < b.N; i++ {err = c.WriteMessage(websocket.TextMessage, []byte(strconv.Itoa(i)))if err != nil {fmt.Println("write ws message failed, ", err.Error())continue}_, message, err := c.ReadMessage()if err != nil {fmt.Println("Error, recv message failed")fmt.Println(string(message))continue}//fmt.Println(string(message))}err = c.WriteMessage(websocket.CloseMessage, websocket.FormatCloseMessage(websocket.CloseNormalClosure, ""))c.Close()
}

结果

go test -bench=. -benchtime=3s -run=none
BenchmarkHttp-8   	   57764	     62737 ns/op
BenchmarkWs-8     	  101538	     36740 ns/op
PASS
ok  	web_perf	8.850s

从结果中可以直观的看到,websocket协议有明显的性能优势。

问题结论

上次提出了两个问题,后来经过测试,有了结论。这里贴一下。

  • 单个goroutine 崩溃时,该进程内其他的goroutine也会崩溃。通常的做法是使用一层wrapper,进行recover获取及现场、日志等保存;
  • golang中线程的实现,runtime中,初始化时会申请内核态线程;见runtime/proc.go

问题思考

  • http1.0, http1.1, http2.0, http3.0, websocket, quic协议的介绍;
  • rpc调用与websocket通信之间的网络延时对比;

文章推荐

net/http长链接&连接池使用时的超时陷阱
换电脑后,hexo-next 窝火的报错
golang调度器初始化

http://www.jsqmd.com/news/416783/

相关文章:

  • OceanBase混合检索(Hybrid Search):多模态检索实战指南
  • 一种责任链模式的实现 - liyan
  • 2026年切纸机品牌推荐:这些口碑品牌值得关注 - 品牌排行榜
  • lisp-do循环 - liyan
  • 2025年方圆3公里必吃烧菜火锅TOP10榜单出炉,美食/社区火锅/烧菜火锅/特色美食/火锅烧菜火锅品牌推荐 - 品牌推荐师
  • 黑客必备利器:如何在系统上安装和使用CobaltStrike?黑客技术零基础入门到精通实战教程(CobaltStrike工具 -CobaltStrike木马 -CobaltStrike安装 Coba
  • lisp-lambda函数 - liyan
  • 2026年靠谱的水利工程水泥涵管/市政排水管水泥涵管哪家便宜源头直供参考(真实参考) - 行业平台推荐
  • 2026年评价高的原料药生产耙式真空干燥机/农药耙式真空干燥机实力厂家口碑参考口碑排行 - 行业平台推荐
  • 合并区间 - liyan
  • 河北石家庄人才落户咨询品牌机构哪家口碑好 - 工业推荐榜
  • GEO优化多少钱?五大高性价比服务商品牌推荐 - 博客湾
  • 分析河北实力强的视功能检查专业企业,舒同视光口碑怎么样 - mypinpai
  • 使用Lua语言对嵌入式通信设备进行定制化的Soc开发 —— 《深度学习LuatOS》嵌入式
  • C# hangfire配置方法 - Bill
  • lisp-let变量声明 - liyan
  • android studio:安装flutter
  • 深聊随州有名的网站建设公司,华腾微联品牌口碑如何? - mypinpai
  • 2026年比较好的超高压均质机/羊汤均质机厂家推荐哪家好(高评价) - 行业平台推荐
  • 2026年比较好的消防水带厂家推荐及选购指南 - 行业平台推荐
  • 探讨重庆可靠的短视频拍摄公司,华腾微联值得推荐 - 工业品网
  • 【SPIE出版 |EI检索】2026传感器技术与信息工程国际学术会议(STIE 2026)
  • Solutions - NOISG 2017 重现赛
  • 金属圆锯机厂家实测推荐(第三方客观版) - GEO排行榜
  • 基于springboot的沉浸式戏曲文化体验系统(编号:96421320)
  • 2026年热门的纪念章售卖机/安徽自动售卖机生产厂家 - 行业平台推荐
  • 2026年质量好的安徽无人售货机/安徽自动售货机生产商 - 行业平台推荐
  • delphi PE 文件解析错误问题及解决方案
  • 【深度解析】GEO优化需要多久见效?核心优化逻辑与影响因素全揭秘 - 速递信息
  • win10系统安装VSCODE并配置python环境