開源的 Web 框架哪個快?我在 GitHub 找到了答案

在開源這片自由的土地上,孕育了太多開源 Web 框架。我在 GitHub 上搜了一下“web framework”關(guān)鍵字顯示有 56000+ 匹配的開源項目,它們百花齊放各有特色,覆蓋多種語言。

相信做過 Web 開發(fā)的程序員,都能說出好幾個 Web 框架,如數(shù)家珍般地說出它們的好。比如我用過的 Python Web 框架有:Django、Tornado、Flask、FastAPI。這些 Web 框架各有特色:
- Django 的大而全
- Flask 的微小上手快
- 專門開發(fā)接口的 FastAPI
不同的 Web 框架,在應(yīng)對不同場景和需求時各有千秋,所以很難片面的說那個 Web 框架就是最好的,但如果單從速度方面比較的話,還是可以比出個高低的! 今天介紹的開源項目,就試圖找出最快的開源 Web 框架。
項目地址:https://github.com/the-benchmarker/web-frameworks
介紹
web-frameworks 定時發(fā)布多種開源 Web 框架性能測試報告的項目,告訴你誰是最快的 Web 框架!

它采用 Ruby 語言編寫,首先通過 Docker 啟動待壓測的 Web 框架,啟動后通過 wrk 壓測服務(wù),最后把測試報告發(fā)布到網(wǎng)站上,結(jié)果支持搜索和排序功能,整個過程完全自動化。
具體的測試參數(shù)和機器配置:
wrk:HTTP 基準測試工具,支持壓測和輸出測試報告。
wrk 的相關(guān)參數(shù):8 線程(-t),壓 15 秒(-d),分別采用并發(fā)(-c) 64、256、512 模式壓測了三次。我在本機用 wrk 對掘金網(wǎng)站做了壓測,用來講解報告的相關(guān)數(shù)據(jù)。
命令:wrk -t8 -d15s -c64 --latency https://juejin.cn
結(jié)果及名詞解釋:

機器配置:
- CPU: 8 Cores (AMD FX-8320E Eight-Core Processor)
- RAM: 16 GB
- OS: Linux
項目中涉及的所有測試,用的都是相同配置的機器,相關(guān)的所有代碼均已開源。盡可能公平公正,完全透明。測試結(jié)果還會隨著 Web 框架的版本迭代而更新,
下面來看看 web-frameworks 最新一期的測試報告。
最快的框架
web-frameworks?測出來的平均延遲,從低到高排序:
1、nickel
Star 數(shù):2.9k|語言:Rust
https://github.com/nickel-org/nickel.rs
一個受 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");
}
由于篇幅問題,這里僅介紹報告中前 2 名的框架。
最能扛的框架
web-frameworks 測出來的平均每秒處理請求數(shù),從高到低排序:
1、activej
Star 數(shù):286|語言:Java
https://github.com/activej/activej
適用于 Web、高負載和微服務(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)由于篇幅問題,這里僅介紹報告中前 2 名的框架。
感受
看完這份 Web 框架測試報告,我發(fā)現(xiàn) Rust 寫的 Web 框架在不同的性能指標的測試結(jié)果中都名列前茅,看來 Rust 在性能方面真的是名不虛傳。
當然性能不是評判一個 Web 框架的唯一標準,今天寫這個項目也是希望可以給大家在選擇 Web 的時候提供一個參考。而且報告中有冷門但具有特點的 Web 框架,可作為玩具項目玩一玩,如果哪天突然火起來的時候,你可能已經(jīng)搶占先機、輕車熟路了。
最后,web-frameworks 的測試結(jié)果共包含 237 個 Web 框架,雖然不多但是這個數(shù)字還在不斷增加...而且 issues 里還有很多 Web 框架申請“出戰(zhàn)”,開源社區(qū)的力量正在讓這個項目越來越好,看到這里我就放心了。
以上就是本文的全部內(nèi)容,希望通過這個開源項目可以讓你找到最快、最能扛的 Web 框架,性能上快人一步。
因為篇幅有限這里僅做了部分指標的介紹,還有更多指標和分類的報告,可點擊「閱讀原文」查看。
- END -?? 關(guān)注「HelloGitHub」第一時間收到更新??
