有许多流行的框架可用于编写小型 Web 应用程序。 Go 和 JavaScript (Node.js) 是最受欢迎的选择。据报道,Netflix 运行在 Node.js 上; Uber 从 Node.js 迁移到 Go 以获得更好的性能。还有一些不太受欢迎的选项,例如Nim 。
深入审查它们的性能特征将具有挑战性。但我只是编写了一个小玩具 Web 应用程序,我会看到差异吗?极简应用程序会告诉您可能的最佳速度,因为任何更复杂的应用程序都必须运行得更慢。
让我们尝试一下。我想要相当于网络服务器的“hello world”。我也不想做任何摆弄:让我们让事情变得简单。
一个极简的 Go 服务器可能如下所示:
包主 导入( “ fmt ” “日志” “网络/http ” ) 函数主( ) { http 。 HandleFunc ( " /simple " , func ( w http.ResponseWriter , r * http.Request ) { FMt 。 Fprintf ( w , “你好! ” ) } ) FMt 。 Printf ( "在端口 3000 处启动服务器\n " ) 如果错误: = http 。 ListenAndServe ( " :3000 " , nil ) ;错误! =零{ 日志。致命(错误) } }
基本的 JavaScript (Node.js) 服务器可能如下所示:
const f = require('fastify')() f.get('/simple', 异步 (请求) => { 返回“你好” } ) f.listen( {端口: 3000 } ) .then(() => console.log('监听3000端口')) .catch(err => console.error(err))
Nim 提供了一种实现相同结果的好方法:
导入选项,异步调度 导入httpbeast proc onRequest ( req :请求) : Future [ void ] = 如果需要。 httpMethod ==一些( HttpGet ) : 案例要求路径。得到( ) “/简单” : 要求。发送( “你好世界” ) 其他: 要求。发送( Http404 ) 运行( onRequest , initSettings (端口=端口( 3000 ) ) )
我写了一个基准测试,我的源代码可用。我在一个强大的、基于 IceLake 的 64 核服务器上运行它。我使用一个简单的庞巴迪命令作为基准测试的一部分:
庞巴迪-c 10 http://localhost:3000/simple
您可以将并发连接数增加到 1000 ( -c 1000 )。我最初的测试使用自动加农炮,这对于这项任务来说是一个糟糕的选择。
我的结果表明 Nim 在这个玩具示例上做得很好。
系统 | 请求/秒(10 个连接) | 请求/秒(10000 个连接) |
---|---|---|
Nim 2.0 和 httpbeast | 315,000 +/- 18,000 | 350,000 +/- 60,000 |
去1.19 | 45,000 +/- 10,000 | 250,000 +/- 45,000 |
Node.js 20(JavaScript) | 45,000 +/- 7,000 | 41,000 +/- 10,000 |
小圆面包 1.04 *(JavaScript) | 40,000 +/- 6,000 | 35,000 +/- 9,000 |
*Bun 的作者 Jarred Sumner 在 X 上表示,目前 Bun 中的 fastify 速度并不快,但 Bun.serve() 比 Bun 中的 node:http 快两倍多。
我的网络服务器几乎不做任何工作,所以这是一个边缘情况。我也没有进行任何配置:它是“开箱即用”的性能。此外,该服务器可能比 Web 开发人员在实践中使用的任何东西都更强大。
这个结果中有相当大的噪音,你不应该完全相信我的数字。我建议您尝试自己运行基准测试。
我查看了一些博客文章,所有结论都认为 Go 更快:
- 在Http Server Performance: NodeJS vs. Go中,Sunavec 发现 Go 比 Node.js 快 34%。他们的基准更加复杂,而且可能更加现实。
- 在服务器端 I/O 性能:Node vs. PHP vs. Java vs. Go 中,Peabody 发现 Go 的扩展性比 Node.js 和 Java 好得多,PHP 排在最后。在压力测试中,他们发现 Java 和 Node.js 不相上下,而 Go 的速度是前者的两倍。
- 在性能基准测试:Bun vs. C# vs. Go vs. Node.js vs. Python 中,他们发现 Bun 和 Go 是赢家,而 Node.js 的运行速度约为一半。 C# 提供中等性能,而 Python 垫底。
一个有趣的问题是,通过使用完全用 C、C++、Rust 或 Zig 等语言编写的服务器是否可以获得更好的性能。我尝试用 C++ 构建等价的东西,但是太痛苦了,所以我最终放弃了。
在准备这篇博文时,我很高兴第一次编译用 Nim 语言编写的软件。我必须说它留下了很好的印象。作者表示 Nim 受到 Python 的启发。我确实感觉很像Python。稍后我会再次访问 nim。
原文: https://lemire.me/blog/2023/10/07/web-server-hello-world-benchmark-go-vs-node-js-vs-nim-vs-bun/