При тестировании моего кода я заметил значительное увеличение времени выполнения, когда пустой ranged- for loop
был удален или нет. Обычно я бы подумал, что компилятор заметил бы, что цикл for не имеет никакой цели, и поэтому его следует игнорировать. В качестве флагов компилятора я использую -O3
(gcc 5.4
). Я также тестировал его с помощью вектора вместо набора и, похоже, работал и дал одинаковое время выполнения в обоих случаях. Похоже, что инкремент итератора стоит все дополнительное время.
Первый случай с диапазоном для цикла все еще присутствует (медленный):
#include <iostream>
#include <set>
int main () {
long result;
std::set<double> results;
for (int i = 2; i <= 10000; ++i) {
results.insert(i);
for (auto element : results) {
// no operation
}
}
std::cout << "Result: " << result << "\n";
}
Второй случай с удаленным диапазоном для цикла (быстрый):
#include <iostream>
#include <set>
int main () {
long result;
std::set<double> results;
for (int i = 2; i <= 10000; ++i) {
results.insert(i);
}
std::cout << "Result: " << result << "\n";
}