while循环比循环更有效。可能是什么原因?

时间:2017-05-04 15:58:59

标签: c++ loops

我正在进行LeetCode挑战(documentation)以获得乐趣,并且惊讶于while循环比for循环更有效。我原本希望编译器生成相同的代码(也按照这些here),但运行时间不同。

while循环大约3毫秒,而for循环大约需要6毫秒。我重复了几次,似乎经常是这样的。

遗憾的是,我没有测试用例,而且我没有任何关于使用的编译器,架构或优化集的信息。我认为这并不重要,因为程序几乎完全相同,并且肯定会使用相同的编译器,体系结构和选项。

有关此事的任何想法或经验吗?

For loop:

vector<int> twoSum(vector<int>& numbers, int target) {
    int upper = numbers.size() - 1;
    int lower = 0;
    int sum;

    for (;lower<upper;) {
        sum = numbers[lower] + numbers[upper];
        if (sum == target) {
            return vector<int> { lower+1, upper+1 };
        } else if (sum > target) {
            upper--;
        } else {
            lower++;
        }
    }
}

while loop:

vector<int> twoSum(vector<int>& numbers, int target) {
    int upper = numbers.size() - 1;
    int lower = 0;
    int sum;

    while (lower<upper) {
        sum = numbers[lower] + numbers[upper];
        if (sum == target) {
            return vector<int> { lower+1, upper+1 };
        } else if (sum > target) {
            upper--;
        } else {
            lower++;
        }
    }
}

2 个答案:

答案 0 :(得分:4)

你没有运行足够长或足够长的测试,毫秒级的基准测试很难验证。

更好的方法是比较生成的程序集:for-loop while-loop。 使用g ++ 6.3,使用最大优化(-O3)编译片段。 从这一点可以看出,根本没有性能差异,因为两者的组装完全相同。

答案 1 :(得分:0)

所有循环都遵循相同的模板:

{
// Initialize
LOOP: 
if(!(/* Condition */) ) {
    goto END
}

// Loop body

// Loop increment/decrement
goto LOOP
}
END:

您的测试必须与CPU的可用处理能力不同。