爲了好玩,我正在做一個LeetCode挑戰(here),並感到驚訝的是while循環比for循環更有效率。我本來希望編譯器生成相同的代碼(也按照這些question and answers),但運行時間不同。While循環比循環更有效。可能是什麼原因?
while循環大約3 ms,for循環大約需要6 ms。我重複了幾次,似乎常常是這樣。
不幸的是,我沒有測試用例,而且我也沒有關於使用的編譯器,架構或優化集的任何信息。我認爲這並不重要,因爲這些程序幾乎完全相同,並確實使用相同的編譯器,體系結構和選項。
在這個問題上的任何想法或經驗?
For循環:
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循環:
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++;
}
}
}
創建[mcve]。 – user2079303
奇怪;除非代碼生成非常差並且優化關閉,否則無法想到它會這樣做的原因 –
您運行循環多少次?是否優化?微觀基準測試可能非常棘手。 – NathanOliver