nestjs vs普通表达

Sha*_*fax 20 nestjs

我刚刚在一个简单的nest控制器上测试了性能,它在get请求(没有数据库)上返回文本.与快递相同的简单GET控制器(中间件).

我使用WRK工具来测试性能.

因此,plain express比nestjs快2倍.为什么nestjs会产生如此多的开销?

Kam*_*iec 92

更新 - 22.09.2018

Benchmarks目录已添加到存储库:https://github.com/nestjs/nest/blob/master/benchmarks/all_output.txt(您也可以在您的计算机上运行基准测试).

更新 - 24.06.2018

Nest v5.0.0支持fastify.Fastifie Nest整合比普通(!)表达更高效.


以下列表显示了Nest与普通快速路由处理程序相比正在做什么:

  • 它用try..catch块包围你的路由处理程序主体
  • 它使每个路由处理程序 async
  • 它创建了一个全球快递路由器
  • 它为每个控制器创建一个单独的路由器
  • 它绑定了错误处理中间件
  • 它绑定body-parser中间件(两者json和扩展urlencoded)

所有提到的事情都反映了一个现实世界的例子(可能99.9%的快递应用程序也必须这样做,这是不可避免的).这意味着如果你想比较Express和Nest性能,你至少应该覆盖以上几点.与以下示例进行比较:

app.get('/', (req, res, next) => res.status(200).send('Hello world'));
Run Code Online (Sandbox Code Playgroud)

在这种情况下是不公平的,因为这还不够.当我覆盖这些要点时,这就是我收到的(表达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
Run Code Online (Sandbox Code Playgroud)

此外,Nest必须:

  • 识别结果是否为Promise/Observable/plain值
  • 根据结果​​类型,使用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
Run Code Online (Sandbox Code Playgroud)

这意味着Nest的表现约为79%(-21%).这是由于上面提到的原因,而且,因为Nest与Node 6.11.x兼容,这意味着它不能在引擎盖下使用async/await - 它必须使用生成器.

根据这些统计数据得出哪个结论?没有,因为我们不习惯创建只返回普通字符串而没有任何异步内容的应用程序.比较Hello world没有任何意义,它只是一个标题:)

PS.我使用了autocannonhttps://github.com/mcollina/autocannon

autocannon -c 1024 -t30 http://localhost:3000

  • 嗨@Kamil,这个答案来自 2018 年,基于 Nest 4.5。现在我们已经在 2019 年底推出了 Nest 6.9.0,同时我们的社区也越来越多,他们渴望使用 Nestjs,如果你们经常更新这个答案,那将会非常有帮助。至少三个月一次? (16认同)
  • 因此ExpressJS更快。注意。 (6认同)
  • @Kedar9444 我毫不怀疑卡米尔会喜欢看到这个定期更新,但你必须意识到他只是一个人。社区的目的是填补空白。因此,如果您对基准感兴趣并希望展示您的工作和贡献,我们热切鼓励您这样做。 (5认同)
  • @Cozzbie,除非您如上所述使用Fastify适配器。然后Nest比Express快。 (4认同)
  • 今年你们有基准更新吗? (2认同)