”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > Hono.js 基准测试:Node.js、Deno 和 Bun — 哪个最快?

Hono.js 基准测试:Node.js、Deno 和 Bun — 哪个最快?

发布于2024-11-09
浏览:665

Deno 2.0 刚刚发布,并声称比 Bun 和 Node.js 更快,同样,Bun 也声称更快。这引起了我的兴趣,所以我决定测试它们的性能,看看它们在现实场景中的比较。

为了公平比较,我需要选择一个与所有三种 JavaScript 运行时环境(Node.js、Deno 和 Bun)兼容的框架。这就是为什么我决定使用 Hono.js,它与这三个工具无缝集成。

测试环境:

操作系统: Ubuntu 24.04.1 LTS (WSL)
系统: Ryzen 5 5500U,16GB RAM
Node.js: v22.9.0
Deno: v2.0.0
包子: v1.1.30

测试命令:

bombardier -c 100 -d 30s http://localhost:3000

对于基准测试,我使用了 Bombardier,这是一种基于 Go 的负载测试工具,在 100 个并发连接下运行 30 秒。每个测试重复三次以确保更准确的结果,并且针对每个环境取这些运行的平均值。

框架:Hono.js

我选择 Hono.js 是因为它的灵活性和交叉兼容性。 Hono.js 允许与所有三种 JavaScript 运行时(Node.js、Deno 和 Bun)轻松集成,使其成为此类基准测试的理想框架。它轻量、快速并且具有简单的 API,这确保了运行时之间的性能差异能够突出显示,而无需太多开销。

结果

以下是每个运行时每秒的平均请求数和最大请求​​数:

Hono.js Benchmark: Node.js vs. Deno  vs. Bun — Which Is the Fastest?(请求/秒)
获胜者:包子

每个运行时的延迟(以每个请求的毫秒为单位)如下所示:

Hono.js Benchmark: Node.js vs. Deno  vs. Bun — Which Is the Fastest?(毫秒/请求)
获胜者: Bun (平均) & Deno (最大)

分析和要点
根据结果​​,得出以下要点:

Node.js: 虽然 Node.js 多年来一直是服务器端 JavaScript 的行业标准,但与 Deno 和 Bun 相比,它在每秒请求数方面表现出较低的性能。它的平均延迟也较高,这表明它在高并发负载下可能会更加困难。然而,Node.js 因其庞大的生态系统和生产环境的稳定性而仍然被广泛采用。

Deno 2.0: Deno 的性能明显优于 Node.js,每秒交付的请求数量增加了一倍以上,同时保持了更低的平均延迟。这表明 Deno 对于处理并发连接进行了高度优化,并且可能成为性能关键型应用程序的强大替代方案。其现代设计和内置功能(如 TypeScript 支持)使其在新项目中具有优势。

Bun: Bun 在原始性能方面优于 Node.js 和 Deno。它每秒处理最多的请求数并保持最低的平均延迟。这使得 Bun 成为速度优先的项目的一个引人注目的选择。然而,它仍然是一个较新的运行时,其生态系统和社区还没有 Node.js 成熟。

结论

在此基准测试中,我使用 Hono.js 作为框架在所有三个环境中测试了 Deno 2.0、Bun 和 Node.js 的性能。结果清楚地表明,Deno 和 Bun 在原始速度和延迟方面均优于 Node.js。尤其是 Bun,在高性能场景中表现出色,而 Deno 提供了注重现代开发功能的平衡解决方案。

虽然 Node.js 可能不是最快的选择,但它仍然是一个可靠的选择,特别是对于依赖其成熟生态系统的项目而言。另一方面,如果您正在开发一个新项目并需要最大限度地提高性能,Deno 和 Bun 都提供了令人信服的替代方案。

最终,运行时的选择将取决于您项目的具体需求。目前,Deno 和 Bun 已经证明自己是 JavaScript 运行时竞赛中的新竞争者,Bun 在性能方面明显领先。

版本声明 本文转载于:https://dev.to/probir-sarkar/honojs-benchmark-nodejs-vs-deno-20-vs-bun-which-is-the-fastest-413j?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-13
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-11-13
  • 在 Go 中使用 WebSocket 进行实时通信
    在 Go 中使用 WebSocket 进行实时通信
    构建需要实时更新的应用程序(例如聊天应用程序、实时通知或协作工具)需要一种比传统 HTTP 更快、更具交互性的通信方法。这就是 WebSockets 发挥作用的地方!今天,我们将探讨如何在 Go 中使用 WebSocket,以便您可以向应用程序添加实时功能。 在这篇文章中,我们将介绍: WebSoc...
    编程 发布于2024-11-13
  • 除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有哪些地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-13
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-13
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-13
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-13
  • 使用 html css 和 javascript 的图像滑块 carosual https://www.instagram.com/webstreet_code/
    使用 html css 和 javascript 的图像滑块 carosual https://www.instagram.com/webstreet_code/
    ?带有缩略图和悬停效果的图像轮播? 嘿,开发社区! ? 在我的最新视频中,我构建了一个优雅的图像轮播,其缩略图突出显示具有平滑悬停效果的活动图像。这种交互式设计增强了用户参与度,并为您的 Web 项目增添了现代感。 主要特点: 响应式布局:轮播在所有屏幕尺寸上都能完美调整。 交互式缩略图:可点击的缩...
    编程 发布于2024-11-12
  • React 的核心:理解组件重新渲染
    React 的核心:理解组件重新渲染
    在学习编程语言时,我们经常深入研究语法并专注于快速构建某些东西,有时会忽略一个关键问题:这种语言实际上解决了什么问题,以及它在幕后如何工作?将我们的注意力转移到理解语言的核心目的和机制上,可以让学习速度更快、适应性更强,使我们能够轻松驾驭最复杂的项目。语法总是可以查找的——即使是最经验丰富的开发人员...
    编程 发布于2024-11-12
  • JavaScript 中的 Deferreds、Promise 和 Future 之间有什么区别?
    JavaScript 中的 Deferreds、Promise 和 Future 之间有什么区别?
    JavaScript 中 Deferreds、Promise 和 Future 的区别在 JavaScript 中,deferreds、promise 和 futures 通常用于处理异步操作。这些概念中的每一个都有其独特的一组特征:Deferreds在正式文档中从未明确定义,deferreds 通...
    编程 发布于2024-11-12
  • 为什么我的 Web 应用程序中的请求之间没有维护 Gorilla 会话变量?
    为什么我的 Web 应用程序中的请求之间没有维护 Gorilla 会话变量?
    使用 Gorilla 会话时未维护会话变量问题使用 Gorilla Sessions Web 工具包时,会话变量不会跨请求保留。当服务器启动并且用户访问 localhost:8100/ 时,他们将被定向到 login.html,因为会话值不存在。登录后,会话变量将被存储,并且用户将被重定向到 hom...
    编程 发布于2024-11-12
  • 如何在Python中像“column -t”命令一样显示列化数据?
    如何在Python中像“column -t”命令一样显示列化数据?
    在 Python 中显示列式数据在命令行管理工具领域,通常需要以良好对齐的方式呈现数据列。虽然制表符提供了一种简单的解决方案,但在处理不同长度的数据时它们会失败。本文旨在通过提出受 Linux“column -t”命令行为启发的 Python 解决方案来应对这一挑战。Python 提供了一个强大的解...
    编程 发布于2024-11-12
  • 在 NumPy 数组中查找特定行的有效方法:问题和解决方案
    在 NumPy 数组中查找特定行的有效方法:问题和解决方案
    高效查找 NumPy 数组中特定行的实例使用 NumPy 数组时,可能会遇到需要确定是否array 包含特定行,但 ndarray 的标准 contains 方法引发了问题。本文针对此问题提出了高效且 Python 的解决方案。一种方法涉及使用 .tolist() 将 NumPy 数组转换为 Pyt...
    编程 发布于2024-11-12
  • 如何解决在服务器上使用 Matplotlib 的 Python 脚本的“_tkinter.TclError:无显示名称且无 $DISPLAY 环境变量”问题?
    如何解决在服务器上使用 Matplotlib 的 Python 脚本的“_tkinter.TclError:无显示名称且无 $DISPLAY 环境变量”问题?
    _tkinter.TclError:没有显示名称,也没有 $DISPLAY 环境变量问题使用 Matplotlib 的 Python 脚本在服务器上失败,并出现错误“生成绘图时没有显示名称和 $DISPLAY 环境变量”。出现此问题的原因是 Matplotlib 默认使用 Xwindows 后端,并...
    编程 发布于2024-11-12
  • 如何使用 Apache Commons IO 在 Java 中递归删除目录?
    如何使用 Apache Commons IO 在 Java 中递归删除目录?
    在 Java 中递归删除目录在 Java 中删除空目录非常简单。然而,当处理包含子目录和文件的目录时,该过程变得更加复杂。本文深入探讨了使用 Apache Commons IO 库递归删除整个目录的有效方法。Apache Commons IO 简介Apache Commons IO 提供了一套全面的...
    编程 发布于2024-11-12

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3