新发现:改动1行代码 提升 Koa 性能接近一倍
发布于 6 个月前 作者 andyhu 1727 次浏览 最后一次编辑是 4 个月前 来自 分享

不多说,先上图

Koa 1:

QQ图片20160715042440.png

Koa 1 with bluebird-co:

QQ图片20160715042430.png

Koa 2:

QQ图片20160715042420.png 以上三图均采用koa自带的benchmarks下run脚本测试,koa 1 with bluebird-co 为改动后把koa内置的co替换成bluebird的coroutine后的测试结果,在这个benchmark里性能几乎翻倍,甚至远超koa 2。当然这个测试脚本可能有一定局限性,但不能不说明一些问题,bluebird的效率不容置疑 详情请参见bluebird评测的bluebird的coroutine和co效率对比: https://github.com/novacrazy/bluebird-co/tree/master/benchmark

代码见 https://github.com/andyhu/koa/tree/bluebird-co 已经发布为npm包,感兴趣的话可以进一步测试 https://www.npmjs.com/package/koa-bluebird-co

经测试,性能提升完全来自替换了内置的Promise为bluebird。如果全局替换global.Promise = requrie('bluebird')的话效率比直接用bluebird-co还要高

8 回复

我在想… 图片是不是贴反了… - - !

哈哈哈,换了个co库,没准koa的性能就上去了

@yinxin630 没贴反,Koa 1 + bluebird 比 Koa 2 快

@andyhu 那如果把koa2也替了,会不会有更大提示?

@i5ting 测试过,如果在koa2项目里,global.Promise = require('bluebird'),的确是更快的

抛开co不说,node native promise 相比 bluebird 就是慢,bluebird作者的解释:

  1. node中的Promise虽然来自v8但其实现是js而不是C。即使用C也并不会快多少,因为promise基本都是在操作js对象和通信
  2. node中使用new Promise的方式,这一下就差了3个开销很大的closures

附连接: http://programmers.stackexchange.com/questions/278778/why-are-native-es6-promises-slower-and-more-memory-intensive-than-bluebird

在自己的框架代码里面真正尝试过,不加bluebird和加bluebird的性能差距真的是1倍多 用了babel,包index.js只能这样写了

//rewite promise, bluebird is more faster
global.Promise = require('bluebird');
require('babel-runtime/core-js/promise').default = Promise;

@richenlin 不错的方法,不过纠正下英语语法 more much faster

回到顶部