这次重写手机选课项目可能会考虑使用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到底应该算多线程还是算单线程