Rust 优化出乎意料地没有提高性能

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

我有一个 Rust 函数,它是我的应用程序中的瓶颈。我尝试对其进行优化,但没有看到预期的性能改进。这就是我所做的:

fn my_function() -> Vec<f64> {
    let mut my_arr = vec![1.0; 30];
    for i in 0..30 {
        my_arr[i] = // calculations to get the value
    }
    my_arr
}

fn another_func(arr: &[f64; 30]) -> i32 {
    let value = rnd_val;
    for i in 0..arr.len() {
        if value < arr[i] {
            return i as i32;
        }
    }
    29
}

优化版本

fn my_function() -> i32 {
    let value = rand_val;
    let mut i = 0;
    while i < 30 {
        if value < /* calculations to get the value */ {
            return i as i32;
        }
        i += 1;
    }
    29
}

在优化版本中,我组合了这两个函数,以避免创建

my_arr
向量,并可能减少迭代次数。但是,我没有看到我的应用程序有任何显着的性能改进。

我对两个版本都进行了分析,结果表明新版本中已经完全消除了分配。然而,尽管有这样的改进,我在我的应用程序中没有看到任何显着的性能提升。

鉴于分配已被取消,导致整体改善不足的原因可能是什么?我还应该考虑其他因素或可以尝试其他优化吗?

其他背景:

  • 获取值的计算只是一些除法和求和,没有任何新变量。
  • 该函数每秒被调用近22000000次

感谢您的见解!

performance rust optimization memory-management
1个回答
0
投票

由于您的优化并不重要,它只是划分操作和少一次分配,而这里“昂贵”的事情是计算,尤其是对计算机执行成本最高的除法(而不是一次分配),因此您的更改应该'不可见。

您的代码中发生的情况与机器实际执行的情况相差很多倍,您有编译器(在本例中是一个很好的编译器)在代码冗余时对其进行编辑(可能您的更改已经在已编译的代码中)代码),并且在编译器之上,机器本身对任务进行优化并重新排列它们,如果变化很小,它们可能是透明的。

如果你真的想检查结果是否更有效,你应该检查编译后的代码(找到一种方法使其汇编并检查更改的效果)。

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