【问题标题】:nestjs vs plain express performancenestjs 与普通快递性能
【发布时间】:2018-05-23 19:44:57
【问题描述】:

我刚刚在一个简单的 Nest 控制器上测试了性能,它在获取请求时返回文本(无数据库)。 和 express 一样的简单 GET 控制器(中间件)。

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

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

【问题讨论】:

  • 您能否提供所执行测试的详细信息?这对我来说很有趣
  • 只有两个简单的 Hello World 字符串渲染,使用 nestjs 控制器和普通 express wrk -t12 -c1024 --timeout 30s http://localhost:3000
  • @Shadowfax 你测试过哪个环境?

标签: nestjs


【解决方案1】:

更新 - 17.03.2020

我们现在正在为每个新 PR 运行基准测试。可以在此处找到最新的基准测试之一: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(您也可以在您的机器上运行基准测试)。

更新 - 2018 年 6 月 24 日

Nest v5.0.0 支持 fastify。 Fastify + Nest 集成比 plain(!) express 更高效。


以下列表显示了 Nest 与普通快速路由处理程序相比所做的事情:

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

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

app.get('/', (req, res, next) => res.status(200).send('Hello world'));

在这种情况下是不公平的,因为这还不够。当我谈到这些要点时,这就是我收到的(表达 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 必须:

  • 识别结果是否是 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

这意味着 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

【讨论】:

  • @Cozzbie 除非你使用 Fastify 适配器,如上所述。然后 Nest 比 Express 快。
  • 嗨@Kamil,所以这个答案来自2018年,基于nest 4.5。现在我们在 2019 年底使用了 Nest 6.9.0,同时我们拥有越来越多的社区,他们渴望使用 Nestjs,如果你们经常更新这个答案会非常有帮助。 3个月至少一次??
  • @Kedar9444 我不怀疑卡米尔会希望看到这个定期更新,但你必须意识到他只是一个人。社区的目的是填补空白。因此,如果您对基准测试感兴趣并希望展示您的工作和贡献,我们非常鼓励您这样做。
  • 今年有基准更新吗?
  • 同样在 2021 年,原生 Fastify 应用比 Fastify 上的 Nest.js 更快。在我们公司,我们使用我们的 API 测试 Nest.js 与相同 API 的原生 Fastify 版本。本机版本快 42%。根据我的经验,实际应用中的差异更大。但这也与我们可以比使用 Nest.js 更好地优化应用程序结构这一事实有关。如果没有给定的混乱框架,可能性会更好。
猜你喜欢
  • 2010-10-30
  • 2014-09-17
  • 1970-01-01
  • 2012-05-16
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 2013-05-12
  • 1970-01-01
相关资源
最近更新 更多