为什么是格式!宏比直接推入字符串慢?

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)

Cha*_*man 2

也许我错了,但它的承诺之一format!是它应该生成尽可能最快的代码。

这从来都不是格式化机制的设计目标。它的设计目的是为了快速编译,我认为也是为了代码大小。从来不追求速度。

如果您正在寻找更快的替代方案(不如手写格式快,但相当快),您可以使用ufmt.

但不要忘记为字符串分配正确的容量,就像您为 所做的那样push_str(),因此这将是一个公平的比较。然后使用write!().

然而,有令人兴奋的消息:有些人正在致力于重写格式化机制以使其更快,并且他们得到了令人兴奋的结果。我们有什么希望。