koa-benchmark
源码 https://github.com/17koa/koa-benchmark
比较koa和koa2和express性能
- 基本结论koa 2 > koa 1 > express
- koa 2- async效率中间件越多越低,暂时还有问题,不建议使用
Prerequisites
for OSX
brew install wrk
Test
首次测试,需要安装依赖,会比较慢
make all
不安装依赖,重复测试
make test
查看中间件请求测试
make test -f Makefile2
Results
➜ koa-benchmark git:(master) ✗ node -v
v4.0.0
➜ koa-benchmark git:(master) ✗ npm -v
2.14.2
➜ koa-benchmark git:(master) ✗ npm test
benchmark koa-1
1 middleware
5976.88
5 middleware
3495.61
10 middleware
5494.52
15 middleware
5444.90
20 middleware
5631.77
30 middleware
5091.48
50 middleware
3657.46
100 middleware
4712.93
benchmark koa-2
1 middleware
5959.41
5 middleware
5653.19
10 middleware
5652.32
15 middleware
5882.88
20 middleware
5929.52
30 middleware
5700.04
50 middleware
5852.57
100 middleware
5211.41
benchmark express
1 middleware
5500.16
5 middleware
5783.63
10 middleware
5561.32
15 middleware
5253.31
20 middleware
5305.64
30 middleware
4950.02
50 middleware
4472.47
100 middleware
4077.43
压力测试模型
假设支持100w
每个用户每天访问a次 (web.tools.com)
每天次数:100w * a
按照80/20原则,80%的访问集中在20%的时间内
100w * a * 80% / 4.8小时
假设对用户来说每次访问6秒钟是可以接受的
(100w*a*80%/4.8h)*6=测试用并发数据
List
可以在线查看性能对比,点击可以排序的
联系我,更多交流
另外sdk里的promise可以使用bluebird替换,性能还会有提升
thinkjs给出的测试结果
koa 1 比express低,这个不完全,我测试的结果是2者差不多,但总体koa 1要好一点点
各位的测试数据会跟电脑配置有直接关系
问下,压力测试一般怎么测的? 有现成的第三方工具,还是自己写啊
中间件能否根据条件载入,而不是每次请求,所有中间件都挨个问一遍
@imhered 源码里有
@yakczh 你这是逃避问题,压测效率的时候是不能这样的,如果是项目里这样是可以的
@i5ting 好,我看看
讲道理的话
从Express到Koa1-2,应该只是callback style 到 Promise style,其它部分基本没什么改变吧
业界普遍认为使用Promise替代callback会损失一部份性能
所以我觉得有点好奇,有没有分析出,性能的差距是怎么来的?
@i5ting 可以测下用 bluebird 替换 Promise 后,koa2-async 的性能
感谢,这结果很满意
@CoderIvan 语法糖意味着你要多几层function传递
@wwj559 嗯,所以我的意思是说不知道koa(koa2)比express快在哪
@i5ting 打扰一下,您觉得KOA2的项目有预编译的必要吗
@Micua 预编译效果都不好,更何况不预编译呢?哈哈
@i5ting 也是,感谢
@Micua 等原生支持了,性能好了,我还是很期待async/await的
觉得缺少对带router的情况的测试,上面测试里express是自带router的,而koa没有,对express有些不公平。
刚好正在写router,对router的实现方式很犹豫,大致有下面三种方案:
express.js自带的router是中间件外先判断是否符合路由,符合一个执行一个。 koa没有自己的router,比较流行的两个第三方router: koa-route,会封装中间件,不筛选中间件,直接执行所有中间件,在中间件内部判断是否符合路由。 koa-router,会先筛选出所有符合路由的中间件,然后compose,再一个个执行。
参考狼叔的测试用例,给koa加了koa-route和koa-router两个测试,关键代码。
// koa2-route
app.use(_.get('/', (ctx, next) => next())); // while 99
// koa2-router
router.get('/', (ctx, next) => next()); // while 99
node v8.4,狼叔的用例是100个中间件路由都相同都匹配请求,这里的用例改成99个不匹配, 只有1个中间件能匹配请求,原因是这样能发挥router的优势,否则koa-router死定了,下面是100个中间件的测试结果:
express.js: 6869.21
koa2-route: 5726.46
koa2-router: 6324.99
结论:在都带有router的情况下,express.js的表现最好,koa-router表现稳定,它的实现方式让它性能下降很平缓,最后是koa-route,它的实现方式最简单,在中间件数量不多的情况下,可以优先考虑。