開源的 Web 框架哪個(gè)快?我在 GitHub 找到了答案
本文轉(zhuǎn)載自微信公眾號(hào)「HelloGitHub」,作者HelloGitHub。轉(zhuǎn)載本文請(qǐng)聯(lián)系HelloGitHub公眾號(hào)。
在開源這片自由的土地上,孕育了太多開源 Web 框架。我在 GitHub 上搜了一下“web framework”關(guān)鍵字顯示有 56000+ 匹配的開源項(xiàng)目,它們百花齊放各有特色,覆蓋多種語言。
相信做過 Web 開發(fā)的程序員,都能說出好幾個(gè) Web 框架,如數(shù)家珍般地說出它們的好。比如我用過的 Python Web 框架有:Django、Tornado、Flask、FastAPI。這些 Web 框架各有特色:
- Django 的大而全
- Flask 的微小上手快
- 專門開發(fā)接口的 FastAPI
不同的 Web 框架,在應(yīng)對(duì)不同場(chǎng)景和需求時(shí)各有千秋,所以很難片面的說那個(gè) Web 框架就是最好的,但如果單從速度方面比較的話,還是可以比出個(gè)高低的! 今天介紹的開源項(xiàng)目,就試圖找出最快的開源 Web 框架。
項(xiàng)目地址:https://github.com/the-benchmarker/web-frameworks
介紹
web-frameworks 定時(shí)發(fā)布多種開源 Web 框架性能測(cè)試報(bào)告的項(xiàng)目,告訴你誰是最快的 Web 框架!
它采用 Ruby 語言編寫,首先通過 Docker 啟動(dòng)待壓測(cè)的 Web 框架,啟動(dòng)后通過 wrk 壓測(cè)服務(wù),最后把測(cè)試報(bào)告發(fā)布到網(wǎng)站上,結(jié)果支持搜索和排序功能,整個(gè)過程完全自動(dòng)化。
具體的測(cè)試參數(shù)和機(jī)器配置:
wrk:HTTP 基準(zhǔn)測(cè)試工具,支持壓測(cè)和輸出測(cè)試報(bào)告。
wrk 的相關(guān)參數(shù):8 線程(-t),壓 15 秒(-d),分別采用并發(fā)(-c) 64、256、512 模式壓測(cè)了三次。我在本機(jī)用 wrk 對(duì)掘金網(wǎng)站做了壓測(cè),用來講解報(bào)告的相關(guān)數(shù)據(jù)。
- 命令:wrk -t8 -d15s -c64 --latency https://juejin.cn
結(jié)果及名詞解釋:
機(jī)器配置:
- CPU: 8 Cores (AMD FX-8320E Eight-Core Processor)
- RAM: 16 GB
- OS: Linux
項(xiàng)目中涉及的所有測(cè)試,用的都是相同配置的機(jī)器,相關(guān)的所有代碼均已開源。盡可能公平公正,完全透明。測(cè)試結(jié)果還會(huì)隨著 Web 框架的版本迭代而更新,
下面來看看 web-frameworks 最新一期的測(cè)試報(bào)告。
最快的框架
web-frameworks 測(cè)出來的平均延遲,從低到高排序:
1、nickel
Star 數(shù):2.9k|語言:Rust
https://github.com/nickel-org/nickel.rs
一個(gè)受 Express.js 啟發(fā)的 Rust Web 框架。示例代碼:
- #[macro_use] extern crate nickel;
- use nickel::{Nickel, HttpRouter};
- fn main() {
- let mut server = Nickel::new();
- server.get("**", middleware!("Hello World"));
- server.listen("127.0.0.1:6767");
- }
2、iron
Star 數(shù):5.9k|語言:Rust
https://github.com/iron/iron
示例代碼:
- extern crate iron;
- extern crate time;
- use iron::prelude::*;
- use iron::{typemap, AfterMiddleware, BeforeMiddleware};
- use time::precise_time_ns;
- struct ResponseTime;
- impl typemap::Key for ResponseTime { type Value = u64; }
- impl BeforeMiddleware for ResponseTime {
- fn before(&self, req: &mut Request) -> IronResult<()> {
- req.extensions.insert::<ResponseTime>(precise_time_ns());
- Ok(())
- }
- }
- impl AfterMiddleware for ResponseTime {
- fn after(&self, req: &mut Request, res: Response) -> IronResult<Response> {
- let delta = precise_time_ns() - *req.extensions.get::<ResponseTime>().unwrap();
- println!("Request took: {} ms", (delta as f64) / 1000000.0);
- Ok(res)
- }
- }
- fn hello_world(_: &mut Request) -> IronResult<Response> {
- Ok(Response::with((iron::StatusCode::OK, "Hello World")))
- }
- fn main() {
- let mut chain = Chain::new(hello_world);
- chain.link_before(ResponseTime);
- chain.link_after(ResponseTime);
- Iron::new(chain).http("localhost:3000");
- }
由于篇幅問題,這里僅介紹報(bào)告中前 2 名的框架。
最能扛的框架
web-frameworks 測(cè)出來的平均每秒處理請(qǐng)求數(shù),從高到低排序:
1、activej
Star 數(shù):286|語言:Java
https://github.com/activej/activej
適用于 Web、高負(fù)載和微服務(wù)的 Java 框架。示例代碼:
- class Main extends HttpServerLauncher {
- @Provides
- AsyncServlet servlet() {
- return request -> HttpResponse.ok200()
- .withPlainText("Hello World");
- }
- public static void main(String[] args) throws Exception {
- Launcher launcher = new HttpHelloWorldExample();
- launcher.launch(args);
- }
- }
2、httpbeast
Star 數(shù):239|語言:Nim
https://github.com/dom96/httpbeast
示例代碼:
- import options, asyncdispatch
- import httpbeast
- proc onRequest(req: Request): Future[void] =
- if req.httpMethod == some(HttpGet):
- case req.path.get()
- of "/":
- req.send("Hello World")
- else:
- req.send(Http404)
- run(onRequest)
由于篇幅問題,這里僅介紹報(bào)告中前 2 名的框架。
感受
看完這份 Web 框架測(cè)試報(bào)告,我發(fā)現(xiàn) Rust 寫的 Web 框架在不同的性能指標(biāo)的測(cè)試結(jié)果中都名列前茅,看來 Rust 在性能方面真的是名不虛傳。
當(dāng)然性能不是評(píng)判一個(gè) Web 框架的唯一標(biāo)準(zhǔn),今天寫這個(gè)項(xiàng)目也是希望可以給大家在選擇 Web 的時(shí)候提供一個(gè)參考。而且報(bào)告中有冷門但具有特點(diǎn)的 Web 框架,可作為玩具項(xiàng)目玩一玩,如果哪天突然火起來的時(shí)候,你可能已經(jīng)搶占先機(jī)、輕車熟路了。
最后,web-frameworks 的測(cè)試結(jié)果共包含 237 個(gè) Web 框架,雖然不多但是這個(gè)數(shù)字還在不斷增加...而且 issues 里還有很多 Web 框架申請(qǐng)“出戰(zhàn)”,開源社區(qū)的力量正在讓這個(gè)項(xiàng)目越來越好,看到這里我就放心了。
以上就是本文的全部?jī)?nèi)容,希望通過這個(gè)開源項(xiàng)目可以讓你找到最快、最能扛的 Web 框架,性能上快人一步。