而循环比循环更有效.可能是什么原因

While loop is more efficient than for loop. What could be the reason?

本文关键字:循环 是什么 有效      更新时间:2023-10-16

我正在做一个leetcode挑战(在此(娱乐,并感到惊讶的是,循环比for循环更有效。我本来希望编译器能生成相同的代码(也按照以下问题和答案(,但是运行时间不同。

while循环约为3毫秒,而for循环占6毫秒左右。我重复了几次,似乎经常是这样。

我不幸没有测试用例,而且我没有关于所用编译器,架构或优化设置的任何信息。我认为这并不重要,因为这些程序几乎相同,并且肯定使用相同的编译器,架构和选项。

在此方面有任何想法或经验?

循环:

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++;
        }
    }
}

循环:

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++;
        }
    }
}

您运行不够或足够长的测试,很难验证基准测试。

更好的方法是比较生成的组件:for-loop和while-loop。使用G 6.3对摘要进行最大优化(-O3(。由此很明显,根本没有性能差异,因为两者的组件完全相同。

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

{
// Initialize
LOOP: 
if(!(/* Condition */) ) {
    goto END
}
// Loop body
// Loop increment/decrement
goto LOOP
}
END:

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