我正在使用 Rust 解决 LeetCode problem 645 "Set Mismatch" .
解决方案是遍历数组并找到重复项,然后向重复项添加错误以查找缺失值。
这是我第一次提交的代码:
impl Solution {
pub fn find_error_nums(nums: Vec<i32>) -> Vec<i32> {
let nums = &mut { nums };
nums.sort();
let mut dup = 0;
for &num in nums.iter() {
if dup == num {
break;
}
dup = num;
}
let sum: i32 = nums.iter().sum();
let correct_sum = ((1 + nums.len()) * nums.len() / 2) as i32;
if sum < correct_sum {
vec![dup, dup + correct_sum - sum]
} else {
vec![dup, dup - (sum - correct_sum)]
}
}
}
耗时 12 毫秒。然后发现最后的if
没有必要,于是第二次提交:
impl Solution {
pub fn find_error_nums(nums: Vec<i32>) -> Vec<i32> {
let nums = &mut { nums };
nums.sort();
let mut dup = 0;
for &num in nums.iter() {
if dup == num {
break;
}
dup = num;
}
let sum: i32 = nums.iter().sum();
let correct_sum = ((1 + nums.len()) * nums.len() / 2) as i32;
// the "if" changed to:
let error = correct_sum - sum;
vec![dup, dup + error]
}
}
我没想到会看到任何运行时差异,但令我惊讶的是,第二次提交只用了 4 毫秒!
为什么微不足道的编程逻辑改变使执行时间减少了 67%?
最佳答案
在这种情况下,编译配置文件很重要。在Debug
模式下,编译器不会努力优化此类代码。
如果您在 Release
模式下编译您的应用程序,这些事情会得到优化。
您还可以在配置中以参数化方式指定优化级别。
我已经转载了你的MCVE在 playground 中,您可以看到它几乎在 Release模式下给出了相同的时间结果,因为它正在优化代码中的这些类型的分支。
关于performance - 为什么删除未使用的 `if` 子句会将执行时间从 12 毫秒减少到 4 毫秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56751875/