75

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

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

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

4

1 回答 1

232

更新 - 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 (您也可以在您的机器上运行基准测试)。

更新 - 24.06.2018

Nestv5.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 - 它必须使用生成器。

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

PS。我使用autocannon了库https://github.com/mcollina/autocannon

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

于 2018-01-12T12:13:03.117 回答