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

标签 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%?

最佳答案

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

如果您在 Release 模式下编译您的应用程序,这些事情会得到优化。

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

Reference


我已经转载了你的MCVE在 playground 中,您可以看到它几乎在 Release模式下给出了相同的时间结果,因为它正在优化代码中的这些类型的分支。

Playground

关于performance - 为什么删除未使用的 `if` 子句会将执行时间从 12 毫秒减少到 4 毫秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56751875/

相关文章:

c++ - std::lock_guard 和 #pragma omp critical 之间的区别

reference - 如何制作引用文献的副本? (生活问题)

rust - 循环中的变量生存时间不够长

debugging - 在Clion中调试Rust会生成 “Error creating process”

java - 从多个表中嵌套选择的性能

java - 搜索性能调整

ruby-on-rails - 在 Rails 中缓存 yaml 文件

rust - 如何使用 Serde 在反序列化期间转换字段?

rust - 允许我的应用程序启动新控制台屏幕的箱子

c++ - Rcpp 函数比相同的 R 函数慢