Когда я начал изучать Java в первый раз, я вспомнил, как я хотел, чтобы цикл для каждого в C ++; однако теперь, когда они были добавлены, а я (немного) мудрее, чем раньше, я должен задаться вопросом, действительно ли они более эффективны?
Есть два случая, которые мне интересны: первый — это традиционный массив, а второй — объект динамического размера, такой как std :: vector.
Я бы предсказал, что итерация по традиционному массиву фиксированного размера будет более эффективной с циклом for, а динамически распределенное хранилище будет быстрее с циклом на основе диапазона.
int fvalues[NUMBER];
for(unsigned int x = 0; x < NUMBER; ++x) {
//Do Stuff
}
for(auto&& i : fvalues) {
//Do Stuff
}std::vector<int> dvalues = std::vector<int>(NUMBER);
for(unsigned int x = 0; x < NUMBER; ++x) {
//Do Stuff (not adding or removing from vector)
}
for(auto&& i : dvalues) {
//Do Stuff (not adding or removing from vector)
}
Любая разница в лучшем случае незначительна. Используя следующий код:
#include <cstdint>
#include <cstddef>
#include <ctime>
#include <iostream>
#include <vector>
const size_t NUMBER = 1000000;
int main() {
time_t start;
time_t finish;int fvalues[NUMBER];time(&start);
for(unsigned int x = 0; x < NUMBER; ++x) {
fvalues[x] = 3;
}
time(&finish);
std::cout << "Fixed For: " << std::difftime(finish, start) << '\n';
time(&start);
for(auto&& i : fvalues) {
i = 5;
}
time(&finish);
std::cout << "Fixed Range: " << std::difftime(finish, start) << '\n';
std::vector<int> dvalues;
for(unsigned int x = 0; x < NUMBER; ++x) {
dvalues.push_back(0);
}
time(&start);
for(unsigned int x = 0; x < NUMBER; ++x) {
dvalues[x] = 3;
}
time(&finish);
std::cout << "Dynamic For: " << std::difftime(finish, start) << '\n';
time(&start);
for(auto&& i : dvalues) {
i = 5;
}
time(&finish);
std::cout << "Dynamic Range: " << std::difftime(finish, start) << '\n';
}
Результат всегда равен 0 для всех тестов. А синхронизация всей программы (команда терминала) дает 0,033 с пользовательского времени, поэтому результат неудивителен.
Других решений пока нет …