为什么 size_t 使代码速度提高了 2.5 倍?

问题描述 投票:0回答:1

我正在 LeetCode 上进行“217.包含重复”挑战。我原来的代码是:

bool containsDuplicate(vector<int>& nums) {
    sort(nums.begin(), nums.end());
    
    for(int i=1; i<nums.size(); ++i) {
        if(nums[i-1] == nums[i]) return true;
    }

    return false;
}

然后,在查看了一些更好的解决方案后,我将其更改为:

bool containsDuplicate(vector<int>& nums) {
    sort(nums.begin(), nums.end());

    const size_t l = nums.size();
    for(size_t i=1; i<l; ++i) {
        if(nums[i-1] == nums[i]) return true;
    }

    return false;
}

更改只是创建另一个存储长度的变量,而不是直接在循环中使用它并使用 size_t 类型。为什么它让代码运行 92 毫秒而不是 256 毫秒?即使不更改代码,leetcode 提交的时间也会有所不同,但平均而言,第二种解决方案似乎更快。

c++ constants size-t
1个回答
0
投票

nums.size()
循环不变,但在第一种情况下,它在每次迭代中都会被评估。时间是调用
nums.size()
一次和调用
i
次之间的差异。

它与

size_t
或添加
l
无关,一切都与 工作完成有关。

一般来说,您应该始终在循环外部评估循环不变量。尽管在某些情况下编译器优化器可以发现并消除循环不变量,但您不应该依赖它来拯救您。尤其是因为它会使未优化的调试构建不必要地变慢。

© www.soinside.com 2019 - 2024. All rights reserved.