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

  • 相关阅读:
    NodeJs操作MongoDB之分页功能与常见问题
    NodeJs之word文件生成与解析
    NodeJs之EXCEL文件导入导出MongoDB数据库数据
    NodeJs之文件上传
    NodeJs之定时器与队列
    NodeJs操作MongoDB之多表查询($lookup)与常见问题
    Windows下安装配置MongoDB
    关于fastJson的几个问题
    (转)java并发编程:CopyOnWriteArrayList
    java并发编程:锁的相关概念介绍
  • 原文地址:https://www.cnblogs.com/zhuyingchun/p/8933907.html
Copyright © 2011-2022 走看看