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)
}

1 ответ

Решение

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

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

Другие вопросы по тегам