我正在使用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%?
答案 0 :(得分:1)
在这种情况下,编译配置文件很重要。在Debug
模式下,编译器不会费劲地优化此类代码。
如果您以Release
模式编译应用程序,则将优化此类操作。
您还可以在配置中以参数化方式指定 优化级别 。
我已经在操场上重现了您的MCVE,您会发现它在发布模式下几乎可以同时给出结果,因为它正在优化代码中的此类分支。