【译文】在 TechEmpower Web 框架基准测试中,Rust 的速度为何如此之快?

💡 原文中文,约4700字,阅读约需12分钟。
📝

内容提要

Rust在TechEmpower Web框架基准测试中表现出色,但需要注意基准测试的局限性。文章介绍了Fortunes基准测试,比较了不同框架的性能。axum [postgresql]的速度比hyper快,可能是因为使用了不同的模板库。axum [postgresql]和hyper都使用了prepared语句,但axum [postgresql - deadpool]没有使用,导致性能较差。两个框架都使用了无共享架构。axum [postgresql]和hyper每个线程都使用一个数据库连接,但实际应用中应使用连接池。may-minihttp使用自定义内存分配器。总结时指出TechEmpower基准测试只是比较,不能作为选择技术的依据。

🔎

延伸解读

模板库差异如何影响性能

axum [postgresql] 比 hyper 更快,部分原因在于两者使用了不同的模板库:axum 使用 yarte,hyper 使用 markup。yarte 在编译时生成高度优化的代码,可能减少了运行时开销。这提醒我们,在性能敏感场景中,模板引擎的选择可能显著影响吞吐量,但具体差异需结合实现细节评估。

prepared 语句与连接池的权衡

axum [postgresql] 和 hyper 都使用了 prepared 语句,而 axum [postgresql - deadpool] 没有,导致每个请求都需要准备查询,增加了数据库往返,性能较差。此外,基准测试中每个线程使用一个数据库连接,且未使用 TLS,这在生产环境中不现实。实际应用应使用连接池,但可能引入竞争,需根据负载权衡。

无共享架构的适用性与局限

axum 和 hyper 采用无共享架构,每个线程运行独立的 tokio 运行时,减少了线程间共享数据的缓存失效开销。然而,这种架构难以在请求间共享状态,且当数据库位于远程时,每线程一个连接的延迟会严重影响性能。因此,它更适合数据库同机部署且状态共享少的场景。

基准测试的误导性与技术选型

TechEmpower 基准测试中,不同框架使用不同的数据库、优化程度和实现风格,甚至被作者形容为“苹果和汽车之间的比较”。最符合习惯用法的 axum [postgresql - sqlx] 反而较慢。因此,不应仅凭基准测试结果选择技术,而应结合实际需求、团队熟悉度和生产环境因素。

❓

Q&A

Rust在TechEmpower基准测试中的表现如何?

Rust在TechEmpower基准测试中表现出色,尤其是may-minihttp和axum [postgresql]的请求次数分别达到585,000次/秒和400,000次/秒。

axum [postgresql]和hyper之间有什么性能差异?

axum [postgresql]的速度比hyper快,主要是因为axum使用了yarte crate模板库,而hyper使用markup crate。

为什么axum [postgresql - deadpool]的性能较差?

axum [postgresql - deadpool]未使用prepared语句,导致每个请求都准备查询,从而增加了数据库往返,影响性能。

基准测试的局限性是什么?

基准测试只能用于比较不同框架的性能,不能作为选择技术的依据,可能导致误导。

在实际应用中,数据库连接应该如何管理?

在实际应用中,建议使用连接池来管理数据库连接,以提高高并发时的性能。

may-minihttp使用了什么样的内存分配器?

may-minihttp使用了自定义的mimalloc内存分配器,建议使用jemalloc等自定义分配器以减少内存碎片。

🏷️

标签

➡️

继续阅读