百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

Python、JavaScript和Rust的Web性能比较

myzbx 2025-09-09 07:31 3 浏览

Python使用FastApi测试;Node.JS使用Fastify;Rust则使用Actix。

选择的Python和Node框架,是在搜索 "最快的<某语言>api "时得到的最高结果;Rust的Actix是一直高度维护的。

测试的基础很简单;在我的MacBook Pro M1上,每个框架处理来自网络服务器的5000个基本 "Hello, World "响应需要多长时间?

我用来运行测试的代码非常简单,显然,我们只关心速度:

Python

客户端代码:

<b>import</b> requests

from requests.adapters <b>import</b> HTTPAdapter

from requests.packages.urllib3.util.retry <b>import</b> Retry


MAX_RETIES = 3


def create_retriable_session():

s = requests.Session()

retries = Retry(

total=MAX_RETIES,

)

s.mount('http:<font><i>//', HTTPAdapter(max_retries=retries))</i></font><font>

s.mount('https:</font><font><i>//', HTTPAdapter(max_retries=retries))</i></font><font>

<b>return</b> s


def main():

s = create_retriable_session()


<b>for</b> _ in range(0, 5000):

s.get(</font><font>"http://127.0.0.1:8000/"</font><font>)

</font>

服务器端,使用fastapi:

from fastapi <b>import</b> FastAPI


app = FastAPI()


@app.get(<font>"/"</font><font>)

async def root():

<b>return</b> {</font><font>"message"</font><font>: </font><font>"Hello World"</font><font>}

</font>

运行服务器:

uvicorn main:app

测试结果:

5.22 s ± 221 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

下面是使用另外一个框架Fastfy使用 异步 后的代码:

<b>const</b> fastify = require('fastify')({logger: false})


<b>const</b> PORT = 8000;


fastify.get('/', async (request, reply) => {

<b>return</b> {message: 'Hello World'}

})


<b>const</b> start = async () => {

<b>try</b> {

await fastify.listen(PORT)

} <b>catch</b> (err) {

fastify.log.error(err)

process.exit(1)

}

}

start()

再次测试结果:

4.49 s ± 84.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

比较结果:

FastApi每秒处理约957.85次,Fastfy每秒处理1113.59次。

Rust

use actix_web::{App, get, HttpResponse, HttpServer, Responder};


#[get(<font>"/"</font><font>)]

async fn hello() -> impl Responder {

HttpResponse::Ok().body(</font><font>"{\"message\": \"Hello World\"}"</font><font>)

}


#[actix_web::main]

async fn main() -> std::io::Result<()> {

HttpServer::<b>new</b>(|| {

App::<b>new</b>()

.serb> express = require('express')

<b>const</b> app = express()

<b>const</b> port = 8000


app.get('/', (req, res) => {

res.json({message: <font>"Hello World"</font><font>})

})


app.listen(port, () => {

console.log(`Example app listening at http:</font><font><i>//localhost:${port}`)</i></font><font>

})

</font>

测试结果:

4.88 s ± 152 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)Rust

use actix_web::{App, get, HttpResponse, HttpServer, Responder};


#[get(<font>"/"</font><font>)]

async fn hello() -> impl Responder {

HttpResponse::Ok().body(</font><font>"{\"message\": \"Hello World\"}"</font><font>)

}


#[actix_web::main]

async fn main() -> std::io::Result<()> {

HttpServer::<b>new</b>(|| {

App::<b>new</b>()

.service(hello)

})

.bind(</font><font>"127.0.0.1:8000"</font><font>)?

.run()

.await

}

</font>

测试结果:

4.32 s ± 58.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

比较结果:

我们再次看到,Rust比python快,也比Fastify快,Rust能够每秒处理1157.41个请求,每秒比Fastify快44个请求,比FastApi每秒快200个请求。

Node.js

只是为了好玩,Express是最常见的节点框架,所以我也想测试一下,Express比fastify的功能更全面,所以我估计它也会更慢。

<b>const</b> express = require('express')

<b>const</b> app = express()

<b>const</b> port = 8000


app.get('/', (req, res) => {

res.json({message: <font>"Hello World"</font><font>})

})


app.listen(port, () => {

console.log(`Example app listening at http:</font><font><i>//localhost:${port}`)</i></font><font>

})

</font>

测试结果:

4.88 s ± 152 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

而且确实比fastify要慢。

结论

Rust绝对是最快的选择,但它是最好的吗?我不确定我是否能回答这个问题,因为98%的情况下这要取决于。你的团队知道什么?该框架有你需要的功能吗?如果没有,你能建立它吗?如果你没有一个专家团队,学习起来有多容易?该框架在4-5年内存在的可能性有多大?

这些测试有一些注意事项,它们是在Python中运行的,所以它们只能以Python发出请求的速度运行,而且它们不是多线程的,所以框架也可能不会使用多线程来响应,这取决于Python请求库中的会话工作方式。另外,一般来说,node是单线程的,node用队列来伪造并发,但是有一种方法可以解决这个问题,那就是用workers,它允许你在不同的线程上运行多个服务器,这取决于CPU有多少逻辑核心,这在生产中非常有用,因为它有巨大的性能提升,但同样,这些测试不能从中受益。

这篇文章的重点不是让你转到Actix/Rust的生产服务器上,重点是展示我在学习新东西时喜欢的一种简单的方法,并希望展示测试并不总是要严肃或复杂。

相关推荐

前端工程师养成计划 专区_前端工程师技能要求

前端工程师必修课本课程从最基本的概念开始讲起,步步深入,带领大家学习HTML、CSS样式基础知识,了解各种常用标签的意义以及基本用法,后半部分讲解CSS样式代码添加,为后面的案例课程打下基础。本课程让...

深入浅出虚拟 DOM 和 Diff 算法,及 Vue2 与 Vue3 中的区别

因为Diff算法,计算的就是虚拟DOM的差异,所以先铺垫一点点虚拟DOM,了解一下其结构,再来一层层揭开Diff算法的面纱,深入浅出,助你彻底弄懂Diff算法原理认识虚拟DOM虚拟...

css 布局简述_css布局的几种方式

本篇简单介绍了css布局体系。包括Flowlayout、display、floats、positionFlowlayout(NormalFlow)CSSFormattingContext...

dart系列之:HTML的专属领域,除了javascript之外,dart也可以

简介虽然dart可以同时用作客户端和服务器端,但是基本上dart还是用做flutter开发的基本语言而使用的。除了andorid和ios之外,web就是最常见和通用的平台了,dart也提供了对HTML...

原来隐藏一个DOM元素可以有这么多种方式,最后一种你肯定不知道

我们在日常编码的时候,隐藏一个dom元素有很多种方式,今天我们来盘点一下隐藏dom元素有哪些方式,最后一种,你绝对没有用过。display:none作为经常用来隐藏元素的css属性,di...

JavaScript精通到深入_javascript进阶书籍推荐

前几天教大家从入门到精通,当然仅靠那一篇文章是不足以带领大家精通JavaScript的,今天给大家带来第二讲!BOM和DOM简介BOM,BrowserObjectModel,浏览器对象模型。BO...

巧克力:从一朵花开始的华丽变身_巧克力花束教程视频

世界上几乎所有的巧克力产品,都出自四五家大公司大型工厂里的流水线。然而,“手工制作巧克力”正在成为一种潮流,吸引着越来越多的人沉醉其中。这些娇嫩的花朵,是你吃过的每一块巧克力的开始。可可花直接生长在...

browser-use:AI 驱动的浏览器自动化神器——DOM识别与交互详解

browser-use可以识别网页中可交互DOM内容,并能与之进行交互。本文将详细介绍browser-use实现这一核心功能的技术细节。一、可交互元素识别browser-use是通过DOMS...

HTML DOM Progress 对象_html中的对象

Progress对象Progress对象是HTML5新增的。Progress对象表示一个HTML<progress>元素。<progress>元素表示任务...

HTML DOM Script 对象_html document对象

Script对象Script对象表示一个HTML<script>元素。访问Script对象您可以使用getElementById()来访问<scrip...

虚拟DOM真的比操作原生DOM快吗?前端大神提供4个参考观点!收藏

尤雨溪:https://www.zhihu.com/question/31809713/answer/53544875VirtualDOM真的比操作原生DOM快吗?1.原生DOM操作v...

前沿|一种新的植入药物或可将HIV的预防时间持续一年

国外已经批准了一种叫做Truvada(中文名:特鲁瓦达)的药物用于HIV感染的暴露前预防。但是由于该药需要每天服用,因此有些人可能无法坚持,从而使得该药的预防效果降低。最近一项新的研究或许可以改变这种...

轻量级埋点sdk搭建,便捷更全面_埋点工具

引言借助埋点监控sdk,我们可以统计用户的点击,页面pv、uv,脚本错误、dom上报等关键信息等。一:项目初始化1.技术栈Tsrollup打包工具2.搭建项目npminit-ytsc--in...

China&#39;s Humanoid Robotics Race Heats Up as Tesla&#39;s Optimus Hits a Wall

TMTPOST--Tesla'sonce-hypedhumanoidrobotproject,Optimus,hashitasnag.Partsprocurementhas...

单机训练速度提升640倍!独家解读快手商业广告模型GPU训练平台Persia

【导读】:近期,快手宣布将在2020年春节前实现3亿DAU,快手商业化营收步伐也随之加速。快手从2018年“商业化元年”开始推行个性化的广告推荐。截止5月底,快手DAU已经突破2亿。随着用户和使用时长...