js软件是什么意思 小白学前端的注意事项

用Python FastApi测试;节点。JS用的是Fastify;Rust用的是Actix。选择Python和节点框架,是在搜索“最快的:api & # 8220在以下情况下获得最高结果:Rust的Actix一直保持的很

本文最后更新时间:  2023-03-01 11:40:25

用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的生产服务器上,而是展示一个我在学习新东西时喜欢的简单方法,我希望展示测试并不总是必须严肃或复杂的。

温馨提示:内容均由网友自行发布提供,仅用于学习交流,如有版权问题,请联系我们。