C ++ Ranged-based For Loop Efficiency

Когда я начал изучать 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)
}

0

Решение

Любая разница в лучшем случае незначительна. Используя следующий код:

#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 с пользовательского времени, поэтому результат неудивителен.

-1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]