Go语言Web框架wego性能测试

23 篇文章 1 订阅
本文对比了GoHttp(Go语言内置http包)和Wego框架在处理HTTP请求、JSON输出以及HTML渲染方面的性能。测试结果显示,Wego在处理带有10个query参数的GET请求和JSON输出上表现出优于GoHttp的性能,尤其是在HTML渲染中,由于Wego的模板缓存机制,其性能显著优于GoHttp。然而,在JSON数据输出方面,两者表现接近。
摘要由CSDN通过智能技术生成

Wego与GoHttp性能对比

GoHttp是go语言自带的http请求处理包,本文对wego框架与go http包访问性能进行对比。

带有10个query参数的get请求

func BenchmarkGetParamWego(B *testing.B) {
	web, _ := NewWeb()
	web.Config.ShowUrlLog = false
	web.initModule()

	web.GET("/text", func(c *WebContext) {
		name := c.QueryParam.GetString("name")
		c.QueryParam.GetString("name_9871")
		c.QueryParam.GetString("name_9872")
		c.QueryParam.GetString("name_9873")
		c.QueryParam.GetString("name_9874")
		c.QueryParam.GetString("name_9875")
		c.QueryParam.GetString("name_9876")
		c.QueryParam.GetString("name_9877")
		c.QueryParam.GetString("name_9878")
		c.QueryParam.GetString("name_9879")
		c.WriteText(200, name.Value)
	})

	var buf bytes.Buffer
	buf.WriteString("/text?name=lisi")
	buf.WriteString("&name_9871=value_9871")
	buf.WriteString("&name_9872=value_9872")
	buf.WriteString("&name_9873=value_9873")
	buf.WriteString("&name_9874=value_9874")
	buf.WriteString("&name_9875=value_9875")
	buf.WriteString("&name_9876=value_9876")
	buf.WriteString("&name_9877=value_9877")
	buf.WriteString("&name_9878=value_9878")
	buf.WriteString("&name_9879=value_9879")
	query := buf.String()

	w := newMockWriter()
	B.ReportAllocs()
	B.ResetTimer()
	for i := 0; i < B.N; i++ {
		req, err := http.NewRequest("GET", query, nil)
		if err != nil {
			B.Log(err)
			return
		}
		web.ServeHTTP(w, req)
	}
}

//go test -v -run=none -bench="BenchmarkGetParamGolang" -benchmem
func BenchmarkGetParamGolang(B *testing.B) {
	mux := http.NewServeMux()
	mux.HandleFunc("/text", func (w http.ResponseWriter, r *http.Request) {
		name := r.FormValue("name")
		r.FormValue("name_9871")
		r.FormValue("name_9872")
		r.FormValue("name_9873")
		r.FormValue("name_9874")
		r.FormValue("name_9875")
		r.FormValue("name_9876")
		r.FormValue("name_9877")
		r.FormValue("name_9878")
		r.FormValue("name_9879")
		w.Write([]byte(name))
	})

	var buf bytes.Buffer
	buf.WriteString("/text?name=lisi")
	buf.WriteString("&name_9871=value_9871")
	buf.WriteString("&name_9872=value_9872")
	buf.WriteString("&name_9873=value_9873")
	buf.WriteString("&name_9874=value_9874")
	buf.WriteString("&name_9875=value_9875")
	buf.WriteString("&name_9876=value_9876")
	buf.WriteString("&name_9877=value_9877")
	buf.WriteString("&name_9878=value_9878")
	buf.WriteString("&name_9879=value_9879")
	query := buf.String()

	w := newMockWriter()
	B.ReportAllocs()
	B.ResetTimer()
	for i := 0; i < B.N; i++ {
		req, err := http.NewRequest("GET", query, nil)
		if err != nil {
			B.Log(err)
			return
		}
		mux.ServeHTTP(w, req)
	}
}

测试结果:

pkg: Wego
BenchmarkGetParamWego-6----------601780--------1705 ns/op---------464 B/op--------4 allocs/op
pkg: Golang
BenchmarkGetParamGolang-6--------342019--------3136 ns/op--------1775 B/op--------18 allocs/op

输出JSON

//go test -v -run=none -bench="BenchmarkWriteJsonWego" -benchmem
func BenchmarkWriteJsonWego(B *testing.B) {
	web, _ := NewWeb()
	web.Config.ShowUrlLog = false
	web.initModule()

	web.GET("/json", func(c *WebContext) {
		var user User
		user.Name = "lisi"
		user.Age = 12
		c.WriteJSON(200, user)
	})

	w := newMockWriter()
	B.ReportAllocs()
	B.ResetTimer()
	for i := 0; i < B.N; i++ {
		req, err := http.NewRequest("GET", "/json", nil)
		if err != nil {
			B.Log(err)
			return
		}
		web.ServeHTTP(w, req)
	}
}

//go test -v -run=none -bench="BenchmarkWriteJsonGolang" -benchmem
func BenchmarkWriteJsonGolang(B *testing.B) {
	mux := http.NewServeMux()
	mux.HandleFunc("/json", func (w http.ResponseWriter, r *http.Request) {
		var user User
		user.Name = "lisi"
		user.Age = 12
		data, err := json.Marshal(user)
		if err != nil {
			B.Log(err)
			return
		}
		w.Header().Set("Content-Type", "application/json; charset=utf-8")
		w.Write(data)
	})

	w := newMockWriter()
	B.ReportAllocs()
	B.ResetTimer()
	for i := 0; i < B.N; i++ {
		req, err := http.NewRequest("GET", "/json", nil)
		if err != nil {
			B.Log(err)
			return
		}
		mux.ServeHTTP(w, req)
	}
}

测试结果:

pkg: Wego
BenchmarkWriteJsonWego-6----------1540137--------780.3 ns/op--------496 B/op--------5 allocs/op
pkg: Golang
BenchmarkWriteJsonGolang-6--------1482672--------809.0 ns/op--------528 B/op--------6 allocs/op

json数据的输出二者持平

输出HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
 <head>
  <title> New Document </title>
  <meta name="Generator" content="EditPlus">
  <meta name="Author" content="">
  <meta name="Keywords" content="">
  <meta name="Description" content="">
 </head>

 <body>
  hello {{.}}
 </body>
</html>
//go test -v -run=none -bench="BenchmarkWriteHTMLWego" -benchmem
func BenchmarkWriteHTMLWego(B *testing.B) {
	web, _ := NewWeb()
	web.Config.ShowUrlLog = false
	web.initModule()

	web.GET("/html", func(c *WebContext) {
		c.WriteHTML(200, "./test.html", "demo")
	})

	w := newMockWriter()
	B.ReportAllocs()
	B.ResetTimer()
	for i := 0; i < B.N; i++ {
		req, err := http.NewRequest("GET", "/html", nil)
		if err != nil {
			B.Log(err)
			return
		}
		web.ServeHTTP(w, req)
	}
}

//go test -v -run=none -bench="BenchmarkWriteHTMLGolang" -benchmem
func BenchmarkWriteHTMLGolang(B *testing.B) {
	mux := http.NewServeMux()
	mux.HandleFunc("/html", func (w http.ResponseWriter, r *http.Request) {
		t, err := template.ParseFiles("./test.html")
		if err!=nil {
			B.Log(err)
			return
		}
		t.Execute(w, "demo")
	})

	w := newMockWriter()
	B.ReportAllocs()
	B.ResetTimer()
	for i := 0; i < B.N; i++ {
		req, err := http.NewRequest("GET", "/html", nil)
		if err != nil {
			B.Log(err)
			return
		}
		mux.ServeHTTP(w, req)
	}
}

测试结果:

pkg: Wego
BenchmarkWriteHTMLWego-6---------718764----------1495 ns/op----------704 B/op--------12 allocs/op
pkg: Golang
BenchmarkWriteHTMLGolang-6--------10000--------119648 ns/op--------14345 B/op--------88 allocs/op

二者差距比较大,主要是因为wego会缓存模板数据,因此性能比较好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go lang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值