【问题标题】:C++ Ranged-based For Loop Efficiency [closed]基于 C++ 范围的 For 循环效率 [关闭]
【发布时间】:2015-10-24 18:26:52
【问题描述】:

当我第一次开始学习 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)
}

【问题讨论】:

  • 不是预测,而是对其进行基准测试。
  • 为什么应该比另一个更有效率?你对这件事有什么想法,还是这只是你的“直觉”?
  • 它并不比使用迭代器迭代慢。
  • 我的怀疑是固定大小的索引可以根据内存位置直接访问,但动态的会有跳过指针的可能。这意味着当前索引使用动态类型会更快,而在固定大小上会产生不必要的开销。
  • 我认为这种“我认为这可能是真的.. 让我们问一下我是否正确”的风格不是 SO 应该存在的。它是关于问题和解决方案的。你这种查询更适合一般的论坛

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


【解决方案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 秒的用户时间,因此结果并不令人惊讶。

【讨论】:

  • 在你所有的例子中,整个循环都将被优化掉。
  • 那么高效:))
猜你喜欢
  • 1970-01-01
  • 2014-01-12
  • 2013-06-06
  • 2013-01-04
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
相关资源
最近更新 更多