为什么 Fastify 的请求处理速度要比 Express 快?

阅读时长 10 分钟读完

为什么 Fastify 的请求处理速度要比 Express 快?

在开发 Web 应用程序时,服务器响应速度通常是一个非常重要的问题。在 Node.js 上,最流行的框架可能是 Express,因为它已经成为了 Node.js 生态系统中的主流。但是,随着 Node.js 生态系统的不断发展和新的技术出现,现在有一些替代品可供选择。其中最受欢迎的是 Fastify。

Fastify 是一个快速、低开销、严格的 Web 框架,旨在优化应用程序性能。事实证明,与 Express 相比,Fastify 明显更快。但是,我们需要了解为什么 Fastify 更快,以及它是如何做到的。

1.被动监听

Express 和 Fastify 的第一个区别涉及被动监听。Express 具有为使用者初始化 HTTP 服务器的功能,它在启动应用程序时将自动创建服务器实例。Fastify 将这一过程移出了构造函数,将其置于 .listen() 方法中。这意味着,要监听端口和主机,需要显式调用代码。

-- -------------------- ---- -------
-- ------- ------
----- --- - ---------
----- ---- - ----

------------ ----- ---- -- -
  --------------- --------
--

---------------- -- -- -
  ------------------- ------- -- --------------------------
--


-- ------- ------
----- ------- - --------------------

---------------- ----- --------- ------ -- -
  ------ ------ --------
--

-------------------- -------- ----- -------- -
  -- ----- -
    ----------------------
    ---------------
  -
  ------------------- ------- -- -------------
--

Fastify 采用了被动监听的方法,可以让 Fastify 延迟开启服务器直到实际监听请求时。这样可以减少冗余的操作,并让 Fastify 更加高效。

2. 活动开销

Fastify 的另一个优势是它的活动开销。一旦客户端发送了 HTTP 请求,Express 将使用大约 0.5ms 的时间来处理该请求。Fastify 的话,只需要消耗大约 0.02ms。

此外,在 Express 中,每个 HTTP 请求都会创建一个 req 和 res 对象,它们会被重复利用以减少内存开销。但是,这些对象需要进行清理以释放内存,这可能会占用一定的时间。Fastify 不同,它有自己的内部机制来处理 HTTP 对象,这减少了创建和清理对象的消耗。

3. 响应速度

Fastify 通过以下方法来提高其响应速度:

3.1 使用 fast-json-stringify

Fastify 使用 fast-json-stringify 取代 JSON 库来序列化和反序列化 JSON 数据,这个库是由 Fastify 团队专门为此目的创建的。它比内置的 JSON.stringify 更快,还能优化混合和嵌套对象。

3.2 异步处理

Fastify 奉行异步思想,尽可能地使用异步编程来提高响应速度。如异步函数、Promise、Await 等等,这些都会使得代码更加高效。

3.3 中间件加载

Fastify 的中间件是按需加载的,这意味着它只会加载应用程序实际所需的中间件。Express 则在每个请求上都调用中间件,这增加了请求的开销。

4. 总体结论

Fastify 并不是免费的午餐,它的代码也不一定适用于所有场景。除了响应速度外,它的路由处理和错误处理也要更为严格。Fastify 是一种低开销、快速、强大且灵活的框架,可以对性能敏感的应用程序起到巨大的帮助作用。因此,我们需要看到其优势,并在实际项目中加以应用。

参考代码

-- -------------------- ---- -------
-- ------
----- ------- - --------------------

---------------- ----- --------- ------ -- -
  ------ ------ --------
--

-------------------- -------- ----- -------- -
  -- ----- -
    ----------------------
    ---------------
  -
  ------------------- ------- -- -------------
--
-- -------------------- ---- -------
-- -- ---- ------

------- ------- ----- ---- --- -------- --- - ----------- ----------
------- - ---------------------------------------- -- ---  --- -

     ---------------------------- --- -- --- ---
     ---------------------------- - -     - ---
     ---------------------------- ------------ ------------ ------------ ----------- -------------- ------------
     ---------------------------- ------------ ------ ------ ---------   --------      --------
     ---------------------------- ------------ ------------ -----------  ----------  -------------- --------------
     ---------------------------- ------------ -----------  -----------  ----------  -------------- --------------
     ---------------------------- -----------  -----------  -----------  ------------ -------------  -------------
     ---------------------------- ------       ------       ------       ------      --------      --------
     ---------------------------- -----------  -----------  -----------  ------------ -------------  -------------
     ---------------------------- ---   -----------
     ---------------------------- --    ------ ------
     ---------------------------- --    ------ ------
-- -------------------- ---- -------
-- ------
----- ------- - -------------------
----- --- - ----------
----- ---- - -----


------------ ----- ---- -- -
  --------------- ---------
---

---------------- -- -- -
  ------------------- ------- -- ---------------------------
---
-- -------------------- ---- -------
-- -- ---- ------

------- ------- ----- ---- --- -------- --- - ----------- ----------
------- - ---------------------------------------- -- ---  --- -

     ---------------------------- --- -- --- ---
     ---------------------------- - -     - ---
     ---------------------------- ----------    ----------- ------------ -----------  -----------    ------------
     ---------------------------- ------------  ------      ------      ---------    --------       --------
     ---------------------------- ----------    ----------  ----------   -----------  ------------   ------------
     ---------------------------- ----------    --------    -----------  ----------   -------------  --------------
     ---------------------------- -----------   ----------  -----------  ----------   -------------  -------------
     ---------------------------- ------        ------      ------       ------       --------       --------
     ---------------------------- ----------    ----------  ----------   -----------  ------------   ------------
     ---------------------------- ---   -----------
     ---------------------------- --    ------ ------
     ---------------------------- --    ------ ------

从上面的测试结果中可以看出,Fastify 比 Express 要快得多。

生产实践

在实际应用中,我们需要根据实际情况进行选择。如果项目的性能非常重要,我们最好选择 Fastify。因为更快的响应速度使得它在高流量的情况下更加实用。如果是小型项目,则可以使用 Express,因为 Express 团队对其进行了广泛的优化,并且拥有一个灵活的插件系统。

如果您计划将代码从 Express 切换到 Fastify,请考虑以下事项:

1. Express 迁移到 Fastify 要像其他迁移一样谨慎

在进行迁移时,我们需要考虑 API 和 Web 应用程序的差异,也要谨慎测试。我们需要测试代码的每个方面,包括性能,以确保所做的任何更改都不会影响现有应用程序的稳定性。

2. Fastify 更符合面向对象编程的思想

Fastify 和 Express 的编程风格不同。Express 在某些方面过于灵活,这使得程序逻辑变得紊乱。另一方面,Fastify 有更合理的必要条件和结果,这遵循了面向对象编程的思想,可以帮助程序员编写更清晰、更简练的代码。Fastify 的 API 让我们可以从其他语言中熟悉的语法中受益,这样可以使我们从源代码中更好地了解程序的意图。

3. Fastify 适用于不同类型的 Web 应用程序

Fastify 不仅适用于公共 Web 应用程序,也适用于需要单一处理器的后台操作。

4. Fastify 在性能测试中的表现

再次强调,Fastify 的性能要明显优于 Express,它非常适合高负载应用场景。但是,使用 Fastify 做出的折衷是更繁琐的配置和慢速的调试。这需要我们进行综合考虑。

结论

本文重点讨论了 Fastify 的请求处理速度更快的原因,并提供了一些用于区分 Fastify 和 Express 的标准。总体而言,我们应该在实际项目中进行权衡,找到适合自己的 Web 框架。最终,我们希望在编写快速、低开销、灵活、高性能的 Web 应用程序时,这篇文章能够给你一些指导意义。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/676ea3c1e9a7045d0d6c0fbc

纠错
反馈