zoukankan      html  css  js  c++  java
  • Vector遍历性能对比

    偶然发现,遍历vector时,使用两种看上去没什么差别的方法,性能上却有很大的差异。

    #include <iostream>
    #include <vector>
    
    class CPoint{
    public:
        int x;
        int y;
    };
    
    int VectorRead_0(const CPoint* arr, size_t size)
    {
        int result = 0;
        for(size_t i = 0; i < size; i ++){
            result += (arr[i].x + arr[i].y);
        }
        return result;
    }
    int VectorRead_1(const vector<CPoint> &arr)
    {
        int result = 0;
        for(size_t i = 0; i < arr.size(); i ++){
            result += (arr[i].x + arr[i].y);
        }
        return result;
    }
    int VectorRead_2(const vector<CPoint> &arr)
    {
        size_t size = arr.size();
        int result = 0;
        for(size_t i = 0; i < size; i ++){
            result += (arr[i].x + arr[i].y);
        }
        return result;
    }
    int VectorRead_3(const vector<CPoint> &arr)
    {
        size_t size = arr.size();
        const CPoint* pArr = &arr[0];
        int result = 0;
        for(size_t i = 0; i < size; i ++){
            result += (pArr[i].x + pArr[i].y);
        }
        return result;
    }
    
    void TestVectorRead()
    {
        const int arrSize = 100000;
        vector<CPoint> arr(arrSize);
        int        i, nLoopCount = 100000;
        DWORD    start,end;
        int    result;
    
        for(i = 0; i < arrSize; i ++){
            arr[i].x = i % 3;
            arr[i].y = i % 4;
        }
    
        start = ::GetTickCount();
        result = 0;
        for (i = 0; i < nLoopCount; i++){
            result += VectorRead_0(&arr[0], arrSize);
        }
        end = ::GetTickCount();
        cout << "VectorRead_0 takes: " << end - start << " result: " << result << std::endl;
    
        start = ::GetTickCount();
        result = 0;
        for (i = 0; i < nLoopCount; i++){
            result += VectorRead_1(arr);
        }
        end = ::GetTickCount();
        cout << "VectorRead_1 takes: " << end - start << " result: " << result << std::endl;
    
        start = ::GetTickCount();
        result = 0;
        for (i = 0; i < nLoopCount; i++){
            result += VectorRead_2(arr);
        }
        end = ::GetTickCount();
        cout << "VectorRead_2 takes: " << end - start << " result: " << result << std::endl;
    
        start = ::GetTickCount();
        result = 0;
        for (i = 0; i < nLoopCount; i++){
            result += VectorRead_3(arr);
        }
        end = ::GetTickCount();
        cout << "VectorRead_3 takes: " << end - start << " result: " << result << std::endl;
    }

    执行结果(运行环境:ThinkPad T430,VS2013):

    VectorRead_0 takes: 5663 result: -769903776
    VectorRead_1 takes: 0 result: -769903776
    VectorRead_2 takes: 0 result: -769903776
    VectorRead_3 takes: 0 result: -769903776

    可见,VectorRead_0性能非常糟糕,很可能编译器对vector有特殊的优化。

    另外,用同样的方式测试了vector在写入情况下的性能,几种方法在性能上并没有明显差异。

  • 相关阅读:
    AC620教程 第十五节 8位7段数码管驱动设计与验证
    解决NIOS II工程移动在磁盘上位置后project无法编译问题
    基于FPGA的XPT2046触摸控制器设计
    Altera SOPC FrameBuffer系统设计教程
    【小梅哥SOPC学习笔记】SOPC开发常见问题及解决办法集锦
    ChromeDriver的安装和使用
    Selenium的安装和使用
    Requests的安装和使用
    安装python3
    centos安装后的个人工具
  • 原文地址:https://www.cnblogs.com/zhuyingchun/p/8933907.html
Copyright © 2011-2022 走看看