为什么 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 是一种低开销、快速、强大且灵活的框架,可以对性能敏感的应用程序起到巨大的帮助作用。因此,我们需要看到其优势,并在实际项目中加以应用。
参考代码
-- -------------------- ---- ------- -- ------ ----- ------- - -------------------- ---------------- ----- --------- ------ -- - ------ ------ -------- -- -------------------- -------- ----- -------- - -- ----- - ---------------------- --------------- - ------------------- ------- -- ------------- --
// index.js import http from "k6/http"; export default function() { http.get("http://localhost:3000"); };
-- -------------------- ---- ------- -- -- ---- ------ ------- ------- ----- ---- --- -------- --- - ----------- ---------- ------- - ---------------------------------------- -- --- --- - ---------------------------- --- -- --- --- ---------------------------- - - - --- ---------------------------- ------------ ------------ ------------ ----------- -------------- ------------ ---------------------------- ------------ ------ ------ --------- -------- -------- ---------------------------- ------------ ------------ ----------- ---------- -------------- -------------- ---------------------------- ------------ ----------- ----------- ---------- -------------- -------------- ---------------------------- ----------- ----------- ----------- ------------ ------------- ------------- ---------------------------- ------ ------ ------ ------ -------- -------- ---------------------------- ----------- ----------- ----------- ------------ ------------- ------------- ---------------------------- --- ----------- ---------------------------- -- ------ ------ ---------------------------- -- ------ ------
-- -------------------- ---- ------- -- ------ ----- ------- - ------------------- ----- --- - ---------- ----- ---- - ----- ------------ ----- ---- -- - --------------- --------- --- ---------------- -- -- - ------------------- ------- -- --------------------------- ---
// index.js import http from "k6/http"; export default function() { http.get("http://localhost:3000"); };
-- -------------------- ---- ------- -- -- ---- ------ ------- ------- ----- ---- --- -------- --- - ----------- ---------- ------- - ---------------------------------------- -- --- --- - ---------------------------- --- -- --- --- ---------------------------- - - - --- ---------------------------- ---------- ----------- ------------ ----------- ----------- ------------ ---------------------------- ------------ ------ ------ --------- -------- -------- ---------------------------- ---------- ---------- ---------- ----------- ------------ ------------ ---------------------------- ---------- -------- ----------- ---------- ------------- -------------- ---------------------------- ----------- ---------- ----------- ---------- ------------- ------------- ---------------------------- ------ ------ ------ ------ -------- -------- ---------------------------- ---------- ---------- ---------- ----------- ------------ ------------ ---------------------------- --- ----------- ---------------------------- -- ------ ------ ---------------------------- -- ------ ------
从上面的测试结果中可以看出,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