Nestjs VS明码快递性能 [英] nestjs vs plain express performance
问题描述
我刚刚在一个简单的Nest控制器上测试了性能,该控制器返回GET请求的文本(没有数据库)。 和EXPRESS相同的简单GET控制器(中间件)。
我使用WRK工具测试性能。
结果是,普通快递比nestjs快2倍。 为什么由nestjs产生如此多的开销?
推荐答案
更新-2020年3月17日
我们现在正在为每个新的公关运行基准。可在此处找到最新的基准之一:https://github.com/nestjs/nest/runs/482105333
Req/sec Trans/sec
Nest-Express 15370 3.17MB
Nest-Fastify 30001 4.38MB
Express 17208 3.53MB
Fastify 33578 4.87MB
这意味着Nest+FastifyAdapter
现在几乎比Express快2倍。
更新-22.09.2018
基准目录已添加到存储库:https://github.com/nestjs/nest/blob/master/benchmarks/all_output.txt(您也可以在计算机上运行基准)。
更新-24.06.2018
Nestv5.0.0
支持fastify。Fastify+Nest集成的性能甚至比普通(!)快递。
下面的列表显示了Nest与普通快递路由处理程序相比所做的工作:
- 它用try..catch块包围您的路由处理程序主体
- 它使每个路由处理程序
async
- 它创建一个全局快速路由器
- 它为每个控制器创建单独的路由器
- 绑定错误处理中间件
- 绑定
body-parser
中间件(包括json
和扩展的urlencoded
)
所有提到的事情都反映了一个现实世界示例(可能99.9%的Express应用程序也必须这样做,这是不可避免的)。这意味着如果您想比较Express和Nest的性能,您至少应该涵盖以上几点。与下面示例的比较:
app.get('/', (req, res, next) => res.status(200).send('Hello world'));
在这种情况下是不公平的,因为这是不够的。当我谈到这些问题时,我收到的是(EXPRESS 4.16.2):
Running 10s test @ http://localhost:3000
1024 connections
Stat Avg Stdev Max
Latency (ms) 225.67 109.97 762
Req/Sec 4560 1034.78 5335
Bytes/Sec 990 kB 226 kB 1.18 MB
46k requests in 10s, 9.8 MB read
此外,Nest还必须:
- 识别结果是否为承诺/可观察/普通值
- 根据结果类型使用
send()
或json()
(+1条件) - 添加3个条件(
if
语句)检查管道、拦截器和警卫
存在Nest(4.5.8)的输出:
Running 10s test @ http://localhost:3000
1024 connections
Stat Avg Stdev Max
Latency (ms) 297.79 55.5 593
Req/Sec 3433.2 367.84 3649
Bytes/Sec 740 kB 81.9 kB 819 kB
34k requests in 10s, 7.41 MB read
这意味着Nest性能大约为79%的EXPRESS(-21%)。这是由于上述原因,而且因为Nest与Node 6.11.x兼容,这意味着它不能在幕后使用异步/等待-它必须使用生成器。
根据这些统计数据得出什么结论?无,因为我们不习惯创建只返回普通字符串而不返回任何异步内容的应用程序。与Hello world
的比较没有任何意义,只是花边新闻:)
PS。我使用了autocannon
库https://github.com/mcollina/autocannon
autocannon -c 1024 -t30 http://localhost:3000
这篇关于Nestjs VS明码快递性能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!