koa-tree-router 高性能的 koa 路由
最近有个非常火的框架叫Fastify。它自称自己高性能的杀手锏之一就是使用了他们自己研发的路由find-my-way。这个路由说是利用基数树的数据结构,查找时间为 O(k),比基于正则的路由要快很多。
我好奇的看了一下他们的实现,居然是基于 Golang 里面一个叫做 echo 的框架的路由修改的。而 Golang 的路由实现当中,当属 julienschmidt/httprouter 这个项目里面的实现性能最高,比 echo 快 3~5 倍。所以我就做了一个小的实验,基于 httprouter 修改一版基数树的路由,但结果一般:
node version: v8.9.1, date: Tue Jan 02 2018 09:49:23 GMT+0800 (CST)
Starting...
3 tests completed.
koa-router x 515,004 ops/sec ±0.39% (92 runs sampled)
find-my-way x 2,745,259 ops/sec ±0.27% (96 runs sampled)
tree-router x 7,088,108 ops/sec ±0.50% (96 runs sampled)
只比 find-my-way 快了两倍多,考虑到他们的实现肯定会有为他们的框架妥协的部分,就算改进了,也不会给他们的框架总体带来多大的提升。
其实现在 Node 社区用的最多的还是 express 和 koa。express 的路由是内置的基于正则的路由,应该不会轻易改动,而 koa 是没有基于基数树的路由的,所以我把我实验性的路由改成专门适配 koa 的。
实现了基本功能之后,我决定使用意大利人开发的autocannon试试效果。
autocannon -c 100 -d 40 -p 10 localhost:8080/test
- koa-router
Stat Avg Stdev Max
Latency (ms) 2.42 6.43 58
Req/Sec 40147.2 495.89 40671
Bytes/Sec 6.14 MB 69 kB 6.29 MB
- koa-tree-router
Stat Avg Stdev Max
Latency (ms) 2.09 5.44 45
Req/Sec 46221.6 718.95 46559
Bytes/Sec 7.14 MB 152 kB 7.34 MB
可以看出 io 有明显提升。