跳转至

抽象真可能引入负成本

洋葱

2023年7月27日 21:23:44

抽象一般增加无用功能,降低性能。然而另一方面,更清晰的结构也给了编译器更多自由去优化。

下面两个 rust 函数功能完全相同,只是第二个opt1_idiomatic采用了更抽象的函数式写法。实测opt1_idiomatic的性能是baseline是几到十几倍。

fn baseline(input: &str) -> i64 {
    let mut res = 0;
    for b in input.bytes() {
        match b {
            b's' => res += 1,
            b'p' => res -= 1,
            _ => continue,
        }
    }
    res
}
fn opt1_idiomatic(input: &str) -> i64 {
    input
        .bytes()
        .map(|b| match b {
            b's' => 1,
            b'p' => -1,
            _ => 0,
        })
        .sum()
}

{n} times faster than C, where n = 128 - Thomas Ip

tommyip/n_times_faster_than_c: Code for blog post "{n} times faster than C, where n = 128"

作者使用 Apple M1 Pro。如果你不是 ARM 架构,测试前需要删除平台相关的函数。