为什么删除未使用的`if`子句将执行时间从12ms减少到4ms?

时间:2019-06-25 10:23:58

标签: performance rust

我正在使用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%?

1 个答案:

答案 0 :(得分:1)

在这种情况下,编译配置文件很重要。在Debug模式下,编译器不会费劲地优化此类代码。

如果您以Release模式编译应用程序,则将优化此类操作。

您还可以在配置中以参数化方式指定 优化级别

Reference


我已经在操场上重现了您的MCVE,您会发现它在发布模式下几乎可以同时给出结果,因为它正在优化代码中的此类分支。

Playground