Dan*_*rov 10 string performance rust
当我尝试生成一个字符串时,我同时使用了两者format!
并直接推入了String
.
String
直接推入 a需要 ~40 ns/iter,而 usingformat!
需要 ~80 ns/iter(两倍长)。
为什么编译器不优化format!
为最快的机器代码?也许我错了,但承诺之一format!
是它应该生成最快的代码。
有没有办法使format!
产生更好的代码?还是在使用时总会有速度损失?
#![feature(test)]
fn do_push(username: &str, password: &str) -> String {
let mut body = String::with_capacity(
"grant_type=password&username=".len()
+ username.len()
+ "&password=".len()
+ password.len(),
);
body.push_str("grant_type=password&username=");
body.push_str(username);
body.push_str("&password=");
body.push_str(password);
return body;
}
fn do_format(username: &str, password: &str) -> String {
format!(
"grant_type=password&username={}&password={}",
username, password
)
}
#[cfg(test)]
mod tests {
extern crate test;
use test::Bencher;
#[bench]
fn bench_push(b: &mut Bencher) {
b.iter(|| do_push("my_real_login", "with my real password"));
}
#[bench]
fn bench_format(b: &mut Bencher) {
b.iter(|| do_format("my_real_login", "with my real password"));
}
}
Run Code Online (Sandbox Code Playgroud)
也许我错了,但它的承诺之一
format!
是它应该生成尽可能最快的代码。
这从来都不是格式化机制的设计目标。它的设计目的是为了快速编译,我认为也是为了代码大小。从来不追求速度。
如果您正在寻找更快的替代方案(不如手写格式快,但相当快),您可以使用ufmt
.
但不要忘记为字符串分配正确的容量,就像您为 所做的那样push_str()
,因此这将是一个公平的比较。然后使用write!()
.
然而,有令人兴奋的消息:有些人正在致力于重写格式化机制以使其更快,并且他们得到了令人兴奋的结果。我们有什么希望。