将锈从1.38.0
更新为1.36.0
版本后,我发现程序运行速度降低了约50%。
[使用了perf之后,我发现在新的rust版本(1.38.0)中,一半的编程时间用在alloc::vec::Vec<T>::retain
上。在旧版本(1.36.0)中,它甚至不会显示。为什么在版本1.38.0
中保留时间会更长?完成的保留呼叫是这样完成的:
some_vec.retain(|&x| x < DEADLINE);
截止期限是一个常数u32,而some_vec是u32的向量
我还试图在两个版本中都没有保留调用的情况下运行该程序。在这种情况下,1.38.0
的平均速度仍然较慢,但只有〜10%的微小幅度,而不是保留前的> 50%。
因此,恢复测试中发生的事情:
version 1.36.0:
with retain: ~18sec
without retain ~11sec
version 1.38.0:
with retain: ~28sec
without retain:~12sec
对于可重现的示例,您可以尝试:
use std::time::Instant;
fn main() {
let start = Instant::now();
let mut my_vec:Vec<u32>;
for _ in 0..100_000{
my_vec = (0..10_000).collect();
my_vec.retain(|&x| x < 9000);
my_vec.retain(|&x| x < 8000);
my_vec.retain(|&x| x < 7000);
my_vec.retain(|&x| x < 6000);
my_vec.retain(|&x| x < 5000);
my_vec.retain(|&x| (x < 5) & (x > 2));
}
let duration = start.elapsed();
println!("Program took: {:?}", duration);
}
使用rustup default 1.36.0
,然后单击rustup default stable
(如果您已将锈更新为最新版本(1.38.0)。对于这个小例子,我得到了:版本Program took: 8.293383522s
的1.38.0
和版本Program took: 4.624297719s
的1.36.0
。`
通常,rust.godbolt.org对于检查所生成代码的质量很有用(但是请不要忘记添加优化标志!)
在您的情况下,为retain
生成的代码已明显更改为更糟:https://rust.godbolt.org/z/ZhVCDg
所以您应该将report that to Rust作为性能回归。