抽象真可能引入负成本¶
洋葱
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 架构,测试前需要删除平台相关的函数。