C++ for 循环和基于范围的循环性能

标签 c++ c++11 for-loop

我读到基于范围的循环在某些编程语言上具有更好的性能。在C++中是不是这样。 例如;

int main()
{
    vector<int> v = {1, 2, 3, 4, 5};

    auto size = v.size();
    // LOOP1
    for (int i = 0; i < size; i++) {
        // do something with v[i]
    }

    // LOOP2    
    for (int& val : v) {
        // do something with val 
    }

    return 0;
}

vector 很大时,LOOP2 的性能是否优于 LOOP1?如果是,为什么?

最佳答案

这是一个粗略的测试。我并不是说这是关于哪个更快的明确答案,但在我看来,在这种特殊情况下,gcc 编译器能够将两个循环优化到大致相同的性能水平。如果您愿意,您绝对可以改进测试方法。

在我的系统上(Ubuntu 14.04,某种 i7,8 GB DDR3,gcc):

没有优化(g++ main.cpp -std=c++11):

Old-fashioned loop: 5.45131 seconds.

Range-based loop: 9.90306 seconds.

经过优化(g++ main.cpp -O3 -std=c++11):

Old-fashioned loop: 0.469001 seconds.

Range-based loop: 0.467045 seconds.

#include <iostream>
#include <vector>
#include <time.h>
using namespace std;

double time_elapsed(timespec& start, timespec& end)
{
    return ((1e9 * end.tv_sec + end.tv_nsec) - 
            (1e9 * start.tv_sec + start.tv_nsec)) / 1.0e9;
}

int main()
{
    vector<int> v(1e9, 42);

    timespec start, end;

//  Old-fashioned loop.
    clock_gettime(CLOCK_MONOTONIC_RAW, &start);
    size_t size = v.size();
    for (size_t i = 0; i < size; i++)
    {
        v[i] *= v[i];
    }
    clock_gettime(CLOCK_MONOTONIC_RAW, &end);

    cout << "Old-fashioned loop: " << time_elapsed(start, end) << " seconds\n";

//  Range-based loop.
    clock_gettime(CLOCK_MONOTONIC_RAW, &start); 
    for (int& val : v)
    {
        val *= val;
    }
    clock_gettime(CLOCK_MONOTONIC_RAW, &end);

    cout << "Range-based loop: " << time_elapsed(start, end) << " seconds.\n";
}

关于C++ for 循环和基于范围的循环性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24916899/

相关文章:

c++ - std::strtol 和 std::stoi 之间有什么区别?

php - 每 10 个广告 - 2 个横幅循环

c++ - Memset 不填充整个指针数组 C++

c++ - 注释期间和之后的 AST 排列

c++ - virtualalloc 的问题

c++ - 可以在 C++11 中有条件地声明友元类吗?

C++11 带小数秒的日期/时间

c++ - 递归和预递减运算符

c - Lint 警告 预期的正缩进

python - 在 Python 的 For 循环中迭代生成器