我有一个 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
向量,并可能减少迭代次数。但是,我没有看到我的应用程序有任何显着的性能改进。
我对两个版本都进行了分析,结果表明新版本中已经完全消除了分配。然而,尽管有这样的改进,我在我的应用程序中没有看到任何显着的性能提升。
鉴于分配已被取消,导致整体改善不足的原因可能是什么?我还应该考虑其他因素或可以尝试其他优化吗?
其他背景:
感谢您的见解!
由于您的优化并不重要,它只是划分操作和少一次分配,而这里“昂贵”的事情是计算,尤其是对计算机执行成本最高的除法(而不是一次分配),因此您的更改应该'不可见。
您的代码中发生的情况与机器实际执行的情况相差很多倍,您有编译器(在本例中是一个很好的编译器)在代码冗余时对其进行编辑(可能您的更改已经在已编译的代码中)代码),并且在编译器之上,机器本身对任务进行优化并重新排列它们,如果变化很小,它们可能是透明的。
如果你真的想检查结果是否更有效,你应该检查编译后的代码(找到一种方法使其汇编并检查更改的效果)。