用Python FastApi测试;节点。JS用的是Fastify;Rust用的是Actix。选择Python和节点框架,是在搜索“最快的:api & # 8220在以下情况下获得最高结果:Rust的Actix一直保持的很
用Python FastApi测试;节点。JS用的是Fastify;Rust用的是Actix。
选择Python和节点框架,是在搜索“最快的<>:api & # 8220在以下情况下获得最高结果:Rust的Actix一直保持的很高。
测试的基础很简单;在我的MacBook Pro M1上,每个框架处理5000 basic & # 8220从网络服务器。你好,世界“需要多长时间回复?
我用来运行测试的代码非常简单。显然,我们只关心速度:
计算机编程语言
客户代码:
& ltb & gt导入& lt/b >要求
来自requests.adapters & ltb & gt导入& lt/b >HTTPAdapter
来自requests . packages . URL lib 3 . util . retry <b & gt导入& lt/b >重试
MAX_RETIES = 3
def create _ retriable _ session():
s =请求。会话()
重试次数=重试次数(
total=MAX_RETIES,
)
s . mount(‘http:<font & gt& lt我& gt//’,http adapter(max _ retries = retries))</I >& lt/font >& ltfont & gt
s . mount(‘https:</font >& ltfont & gt& lt我& gt//’,http adapter(max _ retries = retries))</I >& lt/font >& ltfont & gt
& ltb & gtreturn & lt/b >s
def main():
s = create _ retriable _ session()
& ltb & gtfor & lt/b >_在范围内(0,5000):
s . get(</font >& ltfont & gt”http://127 . 0 . 0 . 1:8000/”& lt/font >& ltfont & gt)
& lt/font >
服务器端,使用fastapi:
来自fastapi & ltb & gt导入& lt/b >FastAPI
app = FastAPI()
@ app . get(<font & gt”/”& lt/font >& ltfont & gt)
异步定义根():
& ltb & gtreturn & lt/b >{ & lt/font >& ltfont & gt”消息”& lt/font >& ltfont & gt:& lt/font >& ltfont & gt”你好世界”& lt/font >& ltfont & gt}
& lt/font >
运行服务器:
uvicorn main:应用程序
测试结果:
每循环5.22秒221毫秒(平均标准时间。戴夫。7次运行,每次1个循环)
下面是使用另一个框架Fastfy使用异步后的代码:
& ltb & gtconst & lt/b >fastify = require(‘fastify & # 8217)({logger: false})
& ltb & gtconst & lt/b >端口= 8000;
fastify . get(‘/’,async(请求,回复)= & gt{
& ltb & gtreturn & lt/b >{消息:‘你好世界’}
})
& ltb & gtconst & lt/b >start = async()= >{
& ltb & gt试试& lt/b >{
等待fastify.listen(端口)
} & ltb & gtcatch & lt/b >(呃){
fastify.log.error(错误)
process.exit(1)
}
}
开始()
再次测试结果:
每循环4.49秒84.7毫秒(平均标准时间戴夫。7次运行,每次1个循环)
比较结果:
FastApi每秒处理约957.85次,Fastfy每秒处理1113.59次。
锈
使用actix_web::{App,get,HttpResponse,HttpServer,Responder };
#[get(<font & gt”/”& lt/font >& ltfont & gt)]
async fn hello()->impl响应者{
HttpResponse::Ok()。正文(& lt/font >& ltfont & gt”{\”消息\ ”: \”你好世界\ ”}”& lt/font >& ltfont & gt)
}
#[actix_web::main]
async fn main()->STD::io::Result <()& gt{
http server::<b & gt新建& lt/b >(|| {
app::<b & gt新建& lt/b >()
。塞尔维亚人& gtexpress = require(‘快递’)
& ltb & gtconst & lt/b >app = express()
& ltb & gtconst & lt/b >端口= 8000
app . get(‘/’,(req,RES)= >{
RES . JSON({ message:<font & gt”你好世界”& lt/font >& ltfont & gt})
})
app.listen(port,()= & gt{
console.log(`示例应用程序侦听http:</font >& ltfont & gt& lt我& gt//localhost:$ { port } `)</I >& lt/font >& ltfont & gt
})
& lt/font >
测试结果:
每循环4.88秒152毫秒(平均标准时间。戴夫。7次运行,每次1个循环)生锈
使用actix_web::{App,get,HttpResponse,HttpServer,Responder };
#[get(<font & gt”/”& lt/font >& ltfont & gt)]
async fn hello()->impl响应者{
HttpResponse::Ok()。正文(& lt/font >& ltfont & gt”{\”消息\ ”: \”你好世界\ ”}”& lt/font >& ltfont & gt)
}
#[actix_web::main]
async fn main()->STD::io::Result <()& gt{
http server::<b & gt新建& lt/b >(|| {
app::<b & gt新建& lt/b >()
。服务(你好)
})
。bind(</font >& ltfont & gt”127.0.0.1:8000″& lt/font >& ltfont & gt)?
。运行()
。等待
}
& lt/font >
测试结果:
每循环4.32秒58.7毫秒(平均标准时间戴夫。7次运行,每次1个循环)
比较结果:
再一次,我们可以看到Rust比python和Fastify更快。Rust每秒可以处理1157.41个请求,比Fastify每秒快44个请求,比FastApi每秒快200个请求。
节点. js
只是为了好玩,Express是最常见的节点框架,所以我也想测试一下。Express比fastify更全面,所以我猜它也会慢一些。
& ltb & gtconst & lt/b >express = require(‘快递’)
& ltb & gtconst & lt/b >app = express()
& ltb & gtconst & lt/b >端口= 8000
app . get(‘/’,(req,RES)= >{
RES . JSON({ message:<font & gt”你好世界”& lt/font >& ltfont & gt})
})
app.listen(port,()= & gt{
console.log(`示例应用程序侦听http:</font >& ltfont & gt& lt我& gt//localhost:$ { port } `)</I >& lt/font >& ltfont & gt
})
& lt/font >
测试结果:
每循环4.88秒152毫秒(平均标准时间。戴夫。7次运行,每次1个循环)
而且真的比fastify慢。
结论
铁锈肯定是最快的选择,但它是最好的吗?我不确定我能不能回答这个问题,因为98%的时候都要看情况。你的团队知道什么?框架有你需要的功能吗?如果没有,能建吗?如果没有专家团队,学起来有多容易?框架在4-5年内存在的可能性有多大?
这些测试有一些注意事项。它们是用Python运行的,所以只能以Python发出请求的速度运行。此外,它们不是多线程的,所以框架可能不会使用多线程来响应,这取决于Python的请求库中的会话如何工作。另外,一般来说,node是单线程的。node使用队列来伪并发,但是有一个方法可以解决这个问题,就是使用workers。它允许您在不同的线程上运行多个服务器,这取决于CPU有多少逻辑核心。这在生产中非常有用,因为它有巨大的性能提升,但同样,这些测试不能从中受益。
这篇文章的重点不是把你转移到Actix/Rust的生产服务器上,而是展示一个我在学习新东西时喜欢的简单方法,我希望展示测试并不总是必须严肃或复杂的。