C ++基于范围的For循环效率

时间:2015-10-24 18:26:53

标签: c++ loops c++11 ranged-loops

当我第一次开始学习Java时,我记得我想过如何在C ++中使用for-each循环;但是,现在它们已被添加,而且我(稍微)比以前更聪明,我不得不怀疑它们实际上是否更有效率?

有两种情况我很好奇,第一种是传统的数组,第二种是动态大小的对象,比如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 个答案:

答案 0 :(得分:-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.033s的用户时间,因此结果并不令人惊讶。