精华 koa 2 vs koa 1 vs express 压测性能大比拼
发布于 8 年前 作者 i5ting 19207 次浏览 最后一次编辑是 7 年前 来自 分享

koa-benchmark

源码 https://github.com/17koa/koa-benchmark

比较koa和koa2和express性能

preview.png

  • 基本结论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

可以在线查看性能对比,点击可以排序的

联系我,更多交流

xiaoweiquan.jpeg

20 回复

另外sdk里的promise可以使用bluebird替换,性能还会有提升

thinkjs给出的测试结果

koa 1 比express低,这个不完全,我测试的结果是2者差不多,但总体koa 1要好一点点

各位的测试数据会跟电脑配置有直接关系

问下,压力测试一般怎么测的? 有现成的第三方工具,还是自己写啊

中间件能否根据条件载入,而不是每次请求,所有中间件都挨个问一遍

@imhered 源码里有

@yakczh 你这是逃避问题,压测效率的时候是不能这样的,如果是项目里这样是可以的

@yakczh router不就是某种意义上的按需加载中间件嘛

来自酷炫的 CNodeMD

@i5ting

讲道理的话

从Express到Koa1-2,应该只是callback style 到 Promise style,其它部分基本没什么改变吧

业界普遍认为使用Promise替代callback会损失一部份性能

所以我觉得有点好奇,有没有分析出,性能的差距是怎么来的?

@i5ting 可以测下用 bluebird 替换 Promise 后,koa2-async 的性能

感谢,这结果很满意

@CoderIvan 语法糖意味着你要多几层function传递

@wwj559 嗯,所以我的意思是说不知道koa(koa2)比express快在哪

@i5ting 打扰一下,您觉得KOA2的项目有预编译的必要吗

@Micua 预编译效果都不好,更何况不预编译呢?哈哈

@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,它的实现方式最简单,在中间件数量不多的情况下,可以优先考虑。

回到顶部