我正在进行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++;
}
}
}
答案 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的可用处理能力不同。