这次重写手机选课项目可能会考虑使用go,于是又该挑web框架了,查了一番资料之后在gin和martini之间无法最终决定。于是跑一发压力测试和旧的expressjs框架做对比。
先贴一下三个框架使用的代码
var http = require('http'); var express = require('express'); var logger = require('morgan'); var app = express(); app.use(logger('dev')); app.use('/', function(req, res) { res.send('Hello world!'); }); http.createServer(app).listen(3001)
package main import ( "github.com/go-martini/martini" ) func main(){ m := martini.Classic(); m.Get("/", func () string { return "Hello, world!" }) m.Run() }
package main import ( "github.com/gin-gonic/gin" "net/http" ) func main(){ app := gin.Default() app.GET("/", func (c *gin.Context){ c.String(http.StatusOK, "hello, world"); }) app.Run(":3000"); }
压力端是ab
框架 | 并发 | 总计请求 | Qps | 平均时间(ms) |
Gin | 100 | 10000 | 2993.84 | 0.334 |
Martini | 100 | 10000 | 2276.21 | 0.439 |
Express | 100 | 10000 | 1300.82 | 0.769 |
Gin | 500 | 10000 | 1576.21 | 0.634 |
Martini | 500 | 10000 | 776.44 | 1.288 |
Express | 500 | 10000 | 609.19 | 1.642 |
Gin | 1000 | 10000 | 1531.32 | 0.653 |
Martini | 1000 | 10000 | 800.18 | 1.250 |
Express | 1000 | 10000 | 1608.332 | 1.608 |
Gin | 2000 | 10000 | 1596.51 | 0.626 |
Martini | 2000 | 10000 | 856.32 | 1.168 |
Express | 2000 | 10000 | 617.67 | 1.619 |
1000并发express反超go,测试了好几次都是这个结果,有点不知道原因,而且node我也没有开cluster,因为还没深入研究gin和martini到底应该算多线程还是算单线程