`gonzales` is the fastest http router in the business and has no unsafe code.
The benchmarks include 130 routes per iteration.
#Regular matching
```
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)
```
#Case insensitive matching
```
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)
```
It costs `1ns` per character of input for matching.
That leads to most routes being matched or not within `10ns` to `20ns`.
It supports case insensitive matching without additional runtime costs.
It also supports path arguments extraction.
Under the hood, it uses a [DFA](https://en.wikipedia.org/wiki/Deterministic_finite_automaton) with a few extra perks.
Many thanks to [BurntSushi](https://github.com/BurntSushi) for his work in this field and his great articles such as [this](https://blog.burntsushi.net/transducers/) .
```rust
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());
```
The router also supports multi-segment matching with `*`, only at the end of a route.
`/hello/world/*` will match every incoming request path that starts with `/hello/world/`.
arriba arriba andale andale!!!