3 个版本
0.0.3-beta | 2021 年 5 月 22 日 |
---|---|
0.0.2-beta | 2021 年 5 月 15 日 |
0.0.1-beta | 2021 年 5 月 14 日 |
#698 in HTTP 服务器
124 每月下载量
被 3 crates 使用
44KB
1.5K SLoC
gonzales
是业内最快的 HTTP 路由器,且没有不安全代码。
基准测试包括每轮 130 条路由。
#正则匹配
test gonzales ... bench: 363 ns/iter (+/- 15)
test matchit ... bench: 403 ns/iter (+/- 12)
test bench_regex_set ... bench: 39604 ns/iter (+/- 2274)
test bench_actix ... bench: 55248 ns/iter (+/- 2905)
test bench_route_recognizer ... bench: 13219 ns/iter (+/- 564)
#不区分大小写的匹配
test gonzales ... bench: 423 ns/iter (+/- 11)
test matchit ... bench: 3921 ns/iter (+/- 104)
test actix ... bench: 54038 ns/iter (+/- 1484)
test regex ... bench: 33513 ns/iter (+/- 3388)
test route-recognizer ... bench: 13622 ns/iter (+/- 1177)
匹配输入每个字符需要 1ns
。这意味着大多数路由在 10ns
到 20ns
内就能被匹配或未匹配。它支持不区分大小写的匹配,而无需额外的运行时成本。它还支持路径参数提取。
在底层,它使用了一个带有一些额外功能的 DFA。感谢 BurntSushi 在这个领域的贡献以及他优秀的文章,如 这篇。
let route = vec!["/hello/{user_id}", "/helloworld"];
let router = RouterBuilder::new()
.ascii_case_insensitive(true)
.build(route);
let m = router.route("/HelloWorld")?;
// the index of the matched route
let index = m.get_index();
assert_eq!(1, index);
// route arguments
let args = m.get_args();
assert!(args.is_empty());
// segments matched with `*`
let segments = m.get_segments();
assert!(segments.is_empty());
路由器还支持多段匹配,使用 *
,仅在路由的末尾。 /hello/world/*
将匹配所有以 /hello/world/
开头的传入请求路径。
向前,向前,走,走!!!
依赖
~73KB