Skip to content

Commit 788771c

Browse files
library: Add a very simple microbenchmark for splitn
1 parent 3bc767e commit 788771c

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

library/coretests/benches/pattern.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,27 @@ fn ends_with_str(b: &mut Bencher) {
3939
}
4040
})
4141
}
42+
43+
#[bench]
44+
fn splitn_on_http_response(b: &mut Bencher) {
45+
fn parse_http(s: &str) -> Result<(&str, &str, &str), &str> {
46+
let mut parts = s.splitn(3, ' ');
47+
let version = parts.next().ok_or("No version")?;
48+
let code = parts.next().ok_or("No status code")?;
49+
let description = parts.next().ok_or("No description")?;
50+
Ok((version, code, description))
51+
}
52+
53+
let response = String::from("HTTP/1.1 418 I'm a teapot\r\n");
54+
let mut res: (&str, &str, &str) = ("", "", "");
55+
b.iter(|| {
56+
for _ in 0..1024 {
57+
res = black_box(match parse_http(black_box(&response)) {
58+
Ok(data) => data,
59+
Err(_) => {
60+
continue;
61+
}
62+
})
63+
}
64+
})
65+
}

library/std/benches/string.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
let response = String::from("HTTP/1.1 418 I'm a teapot\r\n");
2+
let mut res: (&str, &str, &str) = ("", "", "");
3+
let start = Instant::now();
4+
for _ in 0..100_000_000 {
5+
res = match parse_http(&response) {
6+
Ok(data) => data,
7+
Err(_) => {
8+
continue;
9+
}
10+
};
11+
}
12+
let duration = start.elapsed();
13+
14+
println!("version:{}\ncode:{}\ndescription:{}\n", res.0, res.1, res.2);
15+
println!("Time elapsed in parse_response() is: {:?}", duration);
16+
17+
let start2 = Instant::now();
18+
for _ in 0..100_000_000 {
19+
res = match parse_http2(&response) {
20+
Ok(data) => data,
21+
Err(_) => {
22+
continue;
23+
}
24+
};
25+
}
26+
let duration2 = start2.elapsed();
27+
28+
println!("version:{}\ncode:{}\ndescription:{}\n", res.0, res.1, res.2);
29+
println!("Time elapsed in parse_response() is: {:?}", duration2);
30+
}
31+
32+
fn parse_http(s: &str) -> Result<(&str, &str, &str), &str> {
33+
let mut parts = s.splitn(3, ' ');
34+
let version = parts.next().ok_or("No Version")?;
35+
let code = parts.next().ok_or("No status code")?;
36+
let description = parts.next().ok_or("No description")?;
37+
Ok((version, code, description))
38+
}

0 commit comments

Comments
 (0)