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在写入情况下的性能,几种方法在性能上并没有明显差异。

  • 相关阅读:
    day 30 粘包 自定义报头
    day29 网络基础之网络协议和通信
    day28 面向对象的进阶 反射 和类的内置方法
    day 27 模块和包 面向对象的复习
    CGI,FastCGI,PHP-CGI和PHP-FPM的区别
    跨平台的移动应用开发引擎CrossApp简介
    element-ui组件中的select等的change事件中传递自定义参数
    关于setInterval和setTImeout中的this指向问题
    懒加载和预加载的区别
    vueX的五个核心属性
  • 原文地址:https://www.cnblogs.com/zhuyingchun/p/8933907.html
Copyright © 2011-2022 走看看