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

相信做過 Web 開發的程式設計師,都能說出好幾個 Web 框架,如數家珍般地說出它們的好。比如我用過的 Python Web 框架有:Django、Tornado、Flask、FastAPI。這些 Web 框架各有特色:

  • Django 的大而全
  • Flask 的微小上手快
  • 專門開發介面的 FastAPI

不同的 Web 框架,在應對不同場景和需求時各有千秋,所以很難片面的說那個 Web 框架就是最好的,但如果單從速度方面比較的話,還是可以比出個高低的! 今天介紹的開源專案,就試圖找出最快的開源 Web 框架。

專案地址:https://github.com/the-benchmarker/web-frameworks

介紹

web-frameworks 定時釋出多種開源 Web 框架效能測試報告的專案,告訴你誰是最快的 Web 框架!

它採用 Ruby 語言編寫,首先通過 Docker 啟動待壓測的 Web 框架,啟動後通過 wrk 壓測服務,最後把測試報告發布到網站上,結果支援搜尋和排序功能,整個過程完全自動化。

具體的測試引數和機器配置:

wrk:HTTP 基準測試工具,支援壓測和輸出測試報告。

wrk 的相關引數:8 執行緒(-t),壓 15 秒(-d),分別採用併發(-c) 64、256、512 模式壓測了三次。我在本機用 wrk 對掘金網站做了壓測,用來講解報告的相關資料。

命令:wrk -t8 -d15s -c64 --latency https://juejin.cn

結果及名詞解釋:

機器配置

  • CPU: 8 Cores (AMD FX-8320E Eight-Core Processor)
  • RAM: 16 GB
  • OS: Linux

專案中涉及的所有測試,用的都是相同配置的機器,相關的所有程式碼均已開源。儘可能公平公正,完全透明。測試結果還會隨著 Web 框架的版本迭代而更新,

​下面來看看 web-frameworks 最新一期的測試報告。

最快的框架

web-frameworks 測出來的平均延遲,​從低到高排序:

1、nickel

Star 數:2.9k|語言:Rust

https://github.com/nickel-org/nickel.rs

一個受 Express.js 啟發的 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 數: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 測出來的平均每秒處理請求數,從高到低排序:

1、activej

Star 數:286|語言:Java

https://github.com/activej/activej

適用於 Web、高負載和微服務的 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 數: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 框架測試報告,我發現 Rust 寫的 Web 框架在不同的效能指標的測試結果中都名列前茅,看來 Rust 在效能方面真的是名不虛傳。

當然效能不是評判一個 Web 框架的唯一標準,今天寫這個專案也是希望可以給大家在選擇 Web 的時候提供一個參考。而且報告中有冷門但具有特點的 Web 框架,可作為玩具專案玩一玩,如果哪天突然火起來的時候,你可能已經搶佔先機、輕車熟路了。

最後,web-frameworks 的測試結果共包含 237 個 Web 框架,雖然不多但是這個數字還在不斷增加...而且 issues 裡還有很多 Web 框架申請“出戰”,開源社群的力量正在讓這個專案越來越好,看到這裡我就放心了。

以上就是本文的全部內容,希望通過這個開源專案可以讓你找到最快、最能扛的 Web 框架,效能上快人一步!


關注 HelloGitHub 公眾號 第一時間收到更新。

還有更多開源專案的介紹和寶藏專案等待你的發現。