Ich machte eine LeetCode-Herausforderung (here) zum Spaß und war überrascht, dass die while-Schleife effizienter als die for-Schleife war. Ich hätte erwartet, dass der Compiler identischen Code generiert (auch nach diesen question and answers), aber die Laufzeiten sind unterschiedlich.While-Schleife ist effizienter als für Schleife. Was könnte der Grund sein?
Die while-Schleife betrug etwa 3 ms, während die for-Schleife etwa 6 ms benötigte. Ich habe es ein paar Mal wiederholt und es scheint oft so zu sein.
Ich habe leider nicht die Testfälle, und ich habe keine Informationen über Compiler verwendet, die Architektur oder Optimierungen festgelegt. Ich denke, es ist nicht wichtig, weil die Programme fast identisch sind und den gleichen Compiler, die gleiche Architektur und die gleichen Optionen verwenden.
Irgendwelche Ideen oder Erfahrungen in dieser Angelegenheit?
For-Schleife:
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-Schleife:
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++;
}
}
}
Erstellen Sie ein [mcve]. – user2079303
Seltsam; Ich kann mir keinen Grund dafür vorstellen, es sei denn, die Codegenerierung ist wirklich schlecht und die Optimierungen sind deaktiviert. –
Wie oft haben Sie die Schleifen ausgeführt? Gab es Optimierungen? Micro-Benchmarking kann sehr schwierig sein. – NathanOliver