锈更新到版本1.38.0后程序运行变慢

问题描述 投票:3回答:1

将锈从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.293383522s1.38.0和版本Program took: 4.624297719s1.36.0。`

performance rust
1个回答
0
投票

通常,rust.godbolt.org对于检查所生成代码的质量很有用(但是请不要忘记添加优化标志!)

在您的情况下,为retain生成的代码已明显更改为更糟:https://rust.godbolt.org/z/ZhVCDg

所以您应该将report that to Rust作为性能回归。

© www.soinside.com 2019 - 2024. All rights reserved.